EF Core中使用StringComparison.OrdinalIgnoreCase报错,如何实现忽略大小写字符串比较?
EF Core实现忽略大小写的字符串查询
EF Core无法直接翻译带StringComparison.OrdinalIgnoreCase参数的string.Equals方法,这是因为该参数对应的逻辑无法直接映射到通用SQL语法。以下是几种可行的解决方案:
方案1:使用ToLower()/ToUpper()统一大小写(跨数据库通用)
将查询双方的字符串转换为小写(或大写)后再比较,EF Core会自动将ToLower()翻译为数据库对应的内置函数(如SQL Server的LOWER()、PostgreSQL的lower()),确保查询能被正确转换为SQL执行。需注意处理str为null的情况,避免空引用异常:
public async Task<List<MyClass>> GetMyTaskAsync(string? str) { var lowerStr = str?.ToLower(); var myVar = await (from e in _whDbContext.PluralizedMyClass where (str == null && e.MyCol == null) || (str != null && e.MyCol != null && e.MyCol.ToLower() == lowerStr) select e).ToListAsync(); return myVar; }
方案2:使用数据库特定的排序规则(精准匹配)
如果项目针对特定数据库(如SQL Server),可以利用数据库的排序规则实现忽略大小写的比较,这种方式比ToLower()更准确,能避免特殊字符转换时的问题。
以SQL Server为例,使用EF.Functions.Collate指定不区分大小写的排序规则:
public async Task<List<MyClass>> GetMyTaskAsync(string? str) { var myVar = await (from e in _whDbContext.PluralizedMyClass where str == null ? e.MyCol == null : EF.Functions.Collate(e.MyCol, "SQL_Latin1_General_CP1_CI_AS") == str select e).ToListAsync(); return myVar; }
说明:
SQL_Latin1_General_CP1_CI_AS是SQL Server中常用的不区分大小写(CI)、区分重音(AS)的排序规则,可根据数据库配置调整为对应规则。
方案3:使用EF.Functions.Like(适用于模式匹配场景)
如果需要模糊匹配而非精确匹配,可结合统一大小写的方式使用EF.Functions.Like,精确匹配场景下前两种方案更合适:
public async Task<List<MyClass>> GetMyTaskAsync(string? str) { if (str == null) return await _whDbContext.PluralizedMyClass.Where(e => e.MyCol == null).ToListAsync(); var lowerStr = str.ToLower(); return await _whDbContext.PluralizedMyClass .Where(e => e.MyCol != null && EF.Functions.Like(e.MyCol.ToLower(), lowerStr)) .ToListAsync(); }
内容的提问来源于stack exchange,提问作者Dev101684
相关产品推荐
相关产品推荐

