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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:31:09