如何实现不区分大小写的.Contains与.Any组合查询?
解决不区分大小写的数组单词匹配问题
针对你当前的代码,要实现不区分大小写的过滤,需要根据你使用的LINQ场景来调整:
1. 内存集合(LINQ to Objects)
直接使用StringComparison.OrdinalIgnoreCase作为Contains的参数,指定不区分大小写的匹配规则:
query = query.Where(x => words.Any(word => x.Message.Contains(word, StringComparison.OrdinalIgnoreCase)));
- 优先用
OrdinalIgnoreCase而非CurrentCultureIgnoreCase,前者性能更优,且避免不同文化下的大小写匹配差异,除非你有特定的文化匹配需求。
2. Entity Framework(EF Core/EF6)
如果是查询数据库的场景,EF对StringComparison的支持取决于版本:
EF Core 5及以上版本
直接支持Contains的StringComparison参数,写法和LINQ to Objects一致:
query = query.Where(x => words.Any(word => x.Message.Contains(word, StringComparison.OrdinalIgnoreCase)));
EF Core 5以下/EF6版本
需要借助EF的数据库函数来实现,比如用ToLowerInvariant()统一大小写,或者使用EF.Functions.Like:
// 方式1:统一转小写匹配 var lowerCaseWords = words.Select(w => w.ToLowerInvariant()).ToList(); query = query.Where(x => lowerCaseWords.Any(word => x.Message.ToLowerInvariant().Contains(word))); // 方式2:使用EF.Functions.Like(EF Core) query = query.Where(x => words.Any(word => EF.Functions.Like(x.Message, $"%{word}%", StringComparison.OrdinalIgnoreCase)));
- 注意
ToLowerInvariant()比ToLower()更稳定,避免因服务器文化设置导致的大小写转换差异。
额外注意
如果words是空数组,Any()会返回false,导致过滤后没有结果。如果需要这种情况返回所有数据,可以加个判断:
if (words.Any()) { query = query.Where(x => words.Any(word => x.Message.Contains(word, StringComparison.OrdinalIgnoreCase))); } // 否则query保持原样,返回所有数据
内容的提问来源于stack exchange,提问作者Zoinky
相关产品推荐
相关产品推荐

