c# - 为什么我们不能在 Entity Framework 查询中使用数组?

标签 c# .net entity-framework linq

我知道 Entity Framework 查询不能包含数组。例如,这将失败:

var myRow = DbContext.myTable.Single(d => d.Property1 == myArray[0].Property1);

但是如果我像这样首先将该元素分配给一个变量:

var property1 = myArray[0].Property1;
var myRow = DbContext.myTable.Single(d => d.Property1 == property1);

然后就可以了。为什么编译器不能为我们做这件事?它已经进行了优化,并在许多其他情况下通过语法糖为我们提供了捷径。是否存在歧义源会阻止编译器将数组元素复制到后台的临时变量中?还是其他什么原因?

最佳答案

Linq-to-objects 可以很好地处理 - linq-to-EF(或 Linq-to-SQL)会尝试将表达式转换为 SQL。将值放在变量中会告诉提供者您要使用该值,而不是计算表达式。

Why can't the compiler do this for us?

因为编译器没有被编程来区分应该被翻译成 SQL 的表达式和那些应该在编译查询之前被评估的表达式。

Linq 查询使用延迟执行,这意味着在您请求结果之前,查询实际上不会执行。在那之前,它只是一个由构成过滤器、投影、分组、聚合等的单个表达式组成的查询。当它计算表达式时 d => d.Property1 == myArray[0].Property1 它当时计算表达式,所以当提供者到达它时,它会尝试将它转换为 SQL,但它不能这样做。

关于c# - 为什么我们不能在 Entity Framework 查询中使用数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37949820/

相关文章:

c# - 桌面应用程序中的 HTML/CSS/JS

c# - list.AddRange 无法隐式转换类型 'void'

c# - 如何在 Entity Framework 6 的 linq 查询中使用 T-SQL Max

entity-framework - Entity Framework 的类型提供程序

c# - SharpSVN 覆盖现有文件和文件夹

c# - 通过 WPF 命令模式启用提交/取消按钮

c# - FormattedText.BuildGeometry 删除字符

c# - 升级应用程序时安装到同一路径

c# - 使用 AES 解密少量字节

c# - 更新 EF 4.1 中的记录