EF Core 3.1.x:无法翻译LINQ表达式。请将查询重写为可以翻译的形式。

8

EF Core 3.1.x:

我不想在内存中加载所有产品,以下查询会这样做! 如果表中有数百万个产品,猜猜会发生什么?

var products = context.Products.ToList();
products = products.Where(p => p.Name.Contains("xxx")).ToList();

以下查询语句会抛出异常:LINQ表达式'DbSet-Product- .Where(b => b.Name.Contains( value: "xxx", comparisonType: InvariantCultureIgnoreCase))'无法被翻译。请改写可翻译的形式或显式插入对AsEnumerable()、AsAsyncEnumerable()、ToList()或ToListAsync()的调用以切换到客户端评估模式。
var products = context.Products.Where(p => p.Name.Contains("xxx", StringComparison.InvariantCultureIgnoreCase)).ToList();

相关的github问题: #19087

有人可以帮我解决问题吗?如何使用ef core 3.1.x进行服务器端数据筛选?


一些备注:1. EF Core 3从不切换到客户端评估,除非在LINQ查询的最终选择中必要。2. 您的查询无法引发该异常。3. 我看不出这个Github问题与此有何关系。-- 那么,这真的是EF Core 3吗?如果是,您是否发布了引发该异常的确切查询? - Gert Arnold
1
是的,这个查询 var products = context.Products.Where(p => p.Name.Contains("xxx")).ToList(); 也会抛出同样的错误。我正在使用 Microsoft.EntityFrameworkCore,版本号为 3.1.3.0。关于此问题的Github相关问题:这有点类似,但构建使用了成员表达式,我也尝试了但仍然报错。 - Nimesh Vaghasiya
1
p.Name.Contains("xxx")这段代码无法直接转换成"Name like %xxx%"并传递给SQL Server吗? - Nimesh Vaghasiya
这是哪个数据库?这在 Sql Server (Microsoft.EntityFrameworkCore.SqlServer) 上运行正常。 - Gert Arnold
1
这是SqlServer! - Nimesh Vaghasiya
@GertArnold 您是正确的,我的查询包含StringComparison.InvariantCultureIgnoreCase,这导致了错误。我刚刚更新了问题中的错误查询。 - Nimesh Vaghasiya
1个回答

13

EF Core可以将Contains方法翻译为服务器端评估 - 但是不支持重载的Contains方法,该方法接受StringComparison.InvariantCultureIgnoreCase(或任何其他StringComparison)。

此处关闭的问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接