.NET 6+EF Core 6中string.Contains无法翻译的原因咨询
EF Core 6中string.Contains带OrdinalIgnoreCase无法翻译的原因
遇到的错误
LINQ表达式'DbSet
()
.Where(r => True && True && False || r.Title.Contains(
value: "i",
comparisonType: OrdinalIgnoreCase) && True && True && True)'无法被翻译。附加信息:方法'string.Contains'的翻译失败。请将查询重写为可翻译的形式,或通过调用'AsEnumerable'、'AsAsyncEnumerable'、'ToList'或'ToListAsync'显式切换到客户端评估。
原查询代码
return x => (!model.Status.HasValue || x.Status == model.Status) && (!model.RuleTypeId.HasValue || x.RuleTypeId == model.RuleTypeId) && (string.IsNullOrWhiteSpace(model.Title) || x.Title.Contains(model.Title, StringComparison.OrdinalIgnoreCase)) && (!model.UpdateDateFrom.HasValue || x.UpdateDate >= model.UpdateDateFrom) && (!model.UpdateDateTo.HasValue || x.UpdateDate <= model.UpdateDateTo) && (!model.UpdatedBy.HasValue || x.UpdatedBy == model.UpdatedBy);
使用版本:.NET 6,EF Core 6.0.11
原因说明
问题出在你使用的string.Contains(string, StringComparison)重载——EF Core 6.0不支持将这个带StringComparison参数的重载翻译为SQL语句。
EF Core仅支持翻译无参数的string.Contains默认重载(默认区分大小写),因为不同数据库的大小写不敏感查询实现逻辑差异极大,EF Core没办法统一把OrdinalIgnoreCase这类参数映射成通用的SQL语法。
而EF.Functions.Like是EF Core专门为数据库函数映射提供的API,它会直接转换为数据库原生的LIKE语法(配合通配符%),大小写规则会依赖数据库本身的配置(比如SQL Server的排序规则),因此能被正确翻译并在数据库端执行。
内容的提问来源于stack exchange,提问作者Özlem Kozan
相关产品推荐
相关产品推荐

