2011-10-03 16 views
6

kullanım sözlüğü ben:linq: sorguda

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

Yani bu sınırlama geçerli: listeleri ile çalışır iken

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

bu hatayı

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

üretir EF linq veya bir şey mi eksik?

cevap

10

Entity Framework'ün doğası - sorgunuza ifadeler koyduğunuzda, bunları SQL'e çevirmek için elinden gelenin en iyisini yapar, böylece iş sunucuda yapılabilir.

İlk örneğinizde, hem sorguyu hem de sözlük alma çağrısını SQL'e çevirmeye çalışır ve bunu yapamaz, çünkü nasıl yapılacağını bilmez.

İkinci örneğinizde, sorguya yalnızca bir listeyi geçiriyorsunuz. Bunu SQL'e nasıl çevireceğini biliyor.

Bunun gibi birkaç toplama var, bu yüzden EF sorgunuzu tanımlamadan önce bunun hakkında dikkatli olmanız gerekir.

DÜZENLEME Sadece sözlükten okurken ilk sorgu sorgu sonuçlarının yararlandığına dikkat ettim.

Dictionary<int, List<int>> dict = new ... 
var a = SomeEntity 
    .ToArray() 
    .Where(f => dict[f.key].Contains(f.someValue)); 
: aslında SQL sorgusunun içine sözlüğü geçemez çünkü Yani, muhtemelen ilk DB'den tüm kayıtları almak gerekir, o zaman gibi, denetimi gerçekleştirmek için LINQ nesneler kullanın

ToArray() yöntemi, tüm sonuç kümesini belleğe çeker (bunu yapmanın başka yolları vardır, ancak bunu genellikle yapıyorum) ve aşağıdaki Where yan tümcesi, LINQ-to-Entities yerine LINQ-to-nesnelerinde çalışır, sözlük kodunuz düzgün çalışacaktır.

+0

çok açık cevap, teşekkürler – ren