LINQ to Entities不支持LINQ表达式节点类型'ArrayIndex'.但是由linq-to-sql支持

tom*_*msv 5 linq-to-entities entity-framework linq-to-sql

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

The LINQ expression node type 'ArrayIndex' is not supported in LINQ to Entities.
Run Code Online (Sandbox Code Playgroud)

对于这一行:

var a = db.Table.Single(d => d.Date == dates[0]);
Run Code Online (Sandbox Code Playgroud)

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

var firstDate = dates[0];
var a = db.Table.Single(d => d.Date == firstDate);
Run Code Online (Sandbox Code Playgroud)

)

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

Ami*_*aqi 5

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

然而,像 linq to object 这样的 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...
Run Code Online (Sandbox Code Playgroud)

  • 将所有数据从数据库转移到内存中并不是一个好主意。正确的方法是将值复制到变量。`var 日期 = 日期[0]; var a = db.Table.Single(d => d.Date == 日期);` (3认同)