【发布时间】:2020-10-08 23:05:26
【问题描述】:
documentation 表示在最后一次调用Select 时有一些不能被翻译成 SQL 的代码是可以的:
在 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)
上面的代码 sn-p 得到了我告诉的异常。我该如何解决这个问题?为什么英孚抱怨客户评价?
【问题讨论】:
标签: c# .net sql-server linq linq-to-sql