【问题标题】:The LINQ expression node type 'ArrayIndex' is not supported in LINQ to Entities. but is supported by linq-to-sqlLINQ to Entities 不支持 LINQ 表达式节点类型“ArrayIndex”。但受 linq-to-sql 支持
【发布时间】:2013-03-18 18:46:52
【问题描述】:

一个项目刚刚从 linq-to-sql 切换到 linq-to-entities,现在出现错误

The LINQ expression node type 'ArrayIndex' is not supported in LINQ to Entities.

对于这一行:

var a = db.Table.Single(d => d.Date == dates[0]);

(在这种特殊情况下修复它很容易,如

var firstDate = dates[0];
var a = db.Table.Single(d => d.Date == firstDate);

)

但是为什么这在 linq-to-sql 中有效,但在 linq-to-entities 中无效? 他们是否使 linq-to-entities 比 linq-to-sql 更糟? 我错过了什么?

【问题讨论】:

  • LINQ to SQL 和 LINQ to Entities 完全分开开发,这里没有相关的共享代码。它需要 LINQ to SQL 中的额外支持,因为乍一看没有意义(看起来您正试图将 dates 作为数组参数传递,并让服务器读取第一个元素),所以我我猜测它不是很常用,因此根本没有考虑将 LINQ to Entities 考虑在内。由于这是一个猜测,我将避免将其发布为答案。
  • 对我来说它看起来像一个错误。在转换为 SQL 之前,应首先将表达式树解析为最简单的表达式。这基本上是 @dontomaso 通过预先评估日期 [0] 所做的事情,但不必手动执行(尤其是对于这样一个简单的表达式)。

标签: entity-framework linq-to-sql linq-to-entities


【解决方案1】:

这是因为 L2E 只是尝试将您的查询转换为 sql 命令。因此,任何额外的东西(如 .ToString() 之类的方法,以及其他无法转换为 SQL 的东西)都会导致该异常。

但是,像 linq to objects 这样的 L2S 实现了 IEnumerable。因此,它们的目标是不同的:L2E 将 linq 查询转换为 sql 命令,L2O 用于处理内存中的 IEnumerable 对象,而 L2S 用于建模和处理数据库。

现在,如果希望能够在 EF 项目中使用 L2S 查询(使用 L2E),则应首先将从 DbContext 检索到的数据转换为 IEnumerable:

var a = db.Table.AsEnumerable().Single(d => d.Date == dates[0]); 
// or any other methods...

【讨论】:

  • 将所有数据从数据库带到内存是不明智的。正确的方法是将值复制到变量中。 var date = dates[0]; var a = db.Table.Single(d => d.Date == date);
猜你喜欢
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
相关资源
最近更新 更多