2013-03-18 84 views
5

支持的一个项目刚刚从LINQ到SQL来LINQ到实体切换,现在我得到的错误LINQ to Entities不支持LINQ表达式节点类型'ArrayIndex'。但通过LINQ到SQL

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更糟? 我错过了什么?

+2

的LINQ to SQL和LINQ to实体完全分开开发,这里没有相关的共享代码。它在LINQ to SQL中需要额外的支持,乍看之下没有任何意义(看起来你试图将'dates'作为数组参数传递,并让服务器读取第一个元素),因此, m猜测它不是很常用,因此从来没有考虑过LINQ to Entities。由于这是一种猜测,我不会将其作为答案发布。 – hvd 2013-03-18 19:17:49

+0

它看起来像一个bug。在转换为SQL之前,表达式树应首先解析为最简单的表达式。这实际上是@dontomaso通过预先计算日期[0]所做的,但不应该手动执行(特别是对于这样一个简单的表达式)。 – Ackroydd 2013-03-18 23:20:00

回答

2

这是因为L2E只是试图将您的查询转换为sql命令。所以,任何其他的东西(像.ToString()这样的方法,以及其他不能转换为SQL的东西)都会导致这种异常。

但是,类似于对象的L2S实现IEnumerable。因此,它们的目标是不同的:L2E将linq查询转换为sql命令,L2O与内存中的IEnumerable对象以及L2S一起模拟和使用数据库。

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

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

将数据库中的所有数据带入内存不是个好主意。正确的方法是将值复制到变量中。 'var date = dates [0]; var a = db.Table.Single(d => d.Date == date);' – 2014-07-15 14:44:23