2011-10-03 124 views
6

使用字典我有:LINQ到實體框架:在查詢

Dictionary<int, List<int>> dict = new ... 
var a = SomeEntity.Where(f => dict[f.key].Contains(f.someValue)) 

這會產生錯誤

LINQ to Entities does not recognize the method 'System.Collections.Generic.List`1[System.Int32] get_Item(Int32)' method 

同時用列表它的工作原理:

List<int> l = new ... 
var a = SomeEntity.Where(f => l.Contains(f.someValue)) 

所以是這個限制linq EF或我錯過了什麼?

回答

10

這是實體框架的本質 - 當您將表達式放入查詢中時,它會盡最大努力將它們轉換爲SQL,以便可以在服務器上完成工作。

在第一個示例中,它嘗試將查詢和字典檢索調用轉換爲SQL,但無法執行,因爲它不知道如何執行。

在你的第二個例子中,你只是將一個列表傳遞給查詢。它確實知道如何將其轉換爲SQL。

有幾個這樣的陷阱,所以你只需要在定義你的EF查詢之前留意它。

編輯

只注意到從字典中讀取數據時第一個查詢利用查詢結果。所以,既然你不能真正通過你的字典到SQL查詢中,你可能需要首先檢索從數據庫中的所有記錄,然後使用LINQ到對象來執行你的檢查,如:

Dictionary<int, List<int>> dict = new ... 
var a = SomeEntity 
    .ToArray() 
    .Where(f => dict[f.key].Contains(f.someValue)); 

ToArray()方法將整個結果集拉到內存中(還有其他方法可以做到這一點,但這是我通常的做法),並且以下Where子句在LINQ-to-objects而不是LINQ-to-Entities中運行,這意味着你的字典代碼將運行良好。

+0

非常明確的答案,謝謝 – ren