【发布时间】:2020-04-26 22:28:18
【问题描述】:
将 EF Core 2.2 与
结合使用optionsBuilder.ConfigureWarnings(warnings => warnings.Throw(RelationalEventId.QueryClientEvaluationWarning));
通过将Select(t=>t.Value) 更改为Select(t=>t.Value??0m),对 sql server 数据库的工作组通过 linq 查询无法在服务器端进行评估。
为什么它没有被翻译成 SQL,因为它可能变成 SUM(ISNULL(Value,0)) ?
我知道这没有必要,但我想了解它在后台是如何工作的,因为我觉得我错过了一些东西。
【问题讨论】:
-
由于您没有提到任何编译时错误,因此可以安全地假设
Value可以为空。话虽如此,您能否提供更多信息,抛出什么异常?或者可能显示由IQueryable接口准备的sql。我还没有看到实体框架被这么简单的.Select -
是的,它可以为空,并且异常由 QueryClientEvaluationWarning 触发。这是因为没有 ??0m 它被转换为 SQL 并在服务器端正确评估,但 ??0m 它没有被翻译然后在客户端评估,在我的情况下,由于启用警告而触发异常。关于这个主题有很多讨论,因为客户端评估是 ef core 2.2 上的默认行为,并且在 ef core 3.x 上已被删除
-
您能否显示至少部分表架构、
t在此上下文中的类模型以及 linq 语句的其余部分? -
表模式可以是id,value。 (整数,整数)。和查询 db.MyTable.GroupBy(t => t.id).Select(g=> new { Id = g.Key, Total = g.Sum(t=>t.Value??0m)}).ToArray ();
-
嗯 0m 基本上就是你说的
(decimal)0。如果Value是typeOf(int),你的.Select应该不是.Select(t => t.Value ?? 0)
标签: c# sql-server entity-framework-core ef-core-2.2