是否有设置项可让LINQ默认对字符串比较不区分大小写?
LINQ 默认不区分大小写的配置方案
根据你使用的LINQ场景不同,有对应的无侵入全局配置方案,不需要逐个修改WHERE子句:
针对EF/EF Core(查询最终翻译为SQL在SQL Server端执行)
你遇到的逻辑不一致本质是C#原生字符串默认区分大小写,而SQL Server默认排序规则为不区分大小写(CI)导致的差异,全局配置方案如下:
- EF Core 5.0及以上版本,可以直接在DbContext的
OnModelCreating方法中全局配置所有字符串属性使用不区分大小写的排序规则,示例代码:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 全局应用不区分大小写的排序规则 modelBuilder.UseCollation("SQL_Latin1_General_CP1_CI_AS"); }
配置完成后,所有LINQ查询翻译生成的SQL都会自动遵循该排序规则,字符串比较默认走不区分大小写逻辑,无需修改单个查询代码。
- 旧版本EF或者需要自定义数据库结构的场景,可以在建表时统一指定所有字符串字段的排序规则为不区分大小写,后续LINQ查询的
==运算符默认就会匹配数据库的大小写不敏感规则。
针对LINQ to Objects(内存中执行的LINQ查询)
原生LINQ没有全局修改默认字符串比较规则的开关,你可以通过封装扩展方法的方式批量替换原有调用,示例扩展方法:
public static IEnumerable<TSource> WhereIgnoreCase<TSource>(this IEnumerable<TSource> source, Func<TSource, string> keySelector, string compareValue) { return source.Where(x => string.Equals(keySelector(x), compareValue, StringComparison.OrdinalIgnoreCase)); }
全局封装常用的过滤、匹配、排序扩展方法后,全局替换原有方法调用即可,改动量极小。
第三方包相关说明
目前没有完全兼容原生LINQ语法、仅修改默认字符串比较规则的第三方公共包。原因是LINQ是C#的原生语言集成特性,底层字符串比较逻辑依赖基础类库的默认实现,强制修改全局默认规则会破坏其他不相关场景的兼容性。
如果你的场景需要统一规则,自行封装对应扩展方法的成本非常低,完全可以覆盖绝大多数业务使用场景。
内容的提问来源于stack exchange,提问作者Mandelbrotter
相关产品推荐
相关产品推荐

