首页 > 解决方案 > 当最上面的投影包含方法调用时,EF Core 客户端评估不起作用

问题描述

文档说,在最后一次调用中可以有一些无法转换为 SQL 的代码Select

在 EF Core 3.0 中,我们将客户端评估限制为仅在顶级投影上发生(本质上是对 Select() 的最后一次调用)。当 EF Core 3.0 检测到无法在查询中的其他任何位置翻译的表达式时,它会引发运行时异常。

虽然我在最后一次调用中使用了一个方法调用Select(),但我收到了一个System.InvalidOperationException异常抱怨:

LINQ 表达式 ... 无法翻译。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。有关详细信息,请参阅https://go.microsoft.com/fwlink/?linkid=2101038

如果我这样写,我可以让我的代码工作:

// this query works find and gets evaluated well
from entity in DbContext.DbSet<MyEntity>
where <... some conditions ... >
select new EntityDto() 
{
    Prop1 = entity.X.Y,
    Prop2 = someMethod(entity.Z.T),
    Prop3 = <some value>,
    ...
    Prop4 = <some value>,
}

上面的 LINQ 查询中的select子句是一个长代码,所以我决定将它移到另一个单独的私有方法中,以便获得更易读的代码。由于文档中的内容,我希望这会起作用:

// this is the code that gets exception at runtime:
from entity in DbContext.DbSet<MyEntity>
where <... some conditions ... >
select CreateDto(entity.X, entity.Z)

上面的代码片段得到了我告诉的异常。我该如何解决这个问题?为什么英孚抱怨客户评价?

标签: c#.netsql-serverlinqlinq-to-sql

解决方案


虽然我在最后一次调用 Select() 时使用了一个方法调用,

抱歉,“禁用”是“禁用”,而不是“禁用,除非您在最后一次调用 Select 时使用它”。

不要调用该方法。将您获得的内容包装到 AsEnumerable,然后(在枚举中)项目并调用该方法。完毕。


推荐阅读