You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现不区分大小写的.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 10:35:25