2013-03-18 244 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

相關問題