c# - 当最上面的投影包含方法调用时,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)
上面的代码片段得到了我告诉的异常。我该如何解决这个问题?为什么英孚抱怨客户评价?
解决方案
虽然我在最后一次调用 Select() 时使用了一个方法调用,
抱歉,“禁用”是“禁用”,而不是“禁用,除非您在最后一次调用 Select 时使用它”。
不要调用该方法。将您获得的内容包装到 AsEnumerable,然后(在枚举中)项目并调用该方法。完毕。
推荐阅读
- azure-data-factory - ADF - 定义动态触发器
- apache-spark - Spark Master UI 中的应用程序?
- reactjs - Cookies 仅通过 React 代理持久化
- powershell - 运行没有错误且没有结果的 Powershell 脚本
- c++ - 如果使用 goto 将控制权转移到 if(false) 块会发生什么?
- javascript - 为什么执行一个函数后进程没有任何错误就结束了?
- java - 有没有办法在java中获取实例名称?
- dialogflow-es - 在 Dialogflow 中添加条件
- mysql - Python子进程运行mysql转储恢复
- java - 如何使用 maven 从 protobuf 为 Java 目标 11 生成 java 存根?