2011-10-03 17 views
6

ho:LINQ to Entity Framework: Dizionario uso nella query

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

questo produce errore

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

mentre con le liste funziona:

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

Quindi è questa limitazione di linq a EF o mi manca qualcosa?

risposta

10

È la natura di Entity Framework: quando si inseriscono le espressioni nella query, fa del suo meglio per tradurle in SQL, in modo che il lavoro possa essere svolto sul server.

Nel primo esempio, tenta di tradurre sia la query sia la chiamata di richiamo del dizionario in SQL e non è in grado, poiché non sa come.

Nel tuo secondo esempio, stai semplicemente passando un elenco nella query. Sa come tradurre ciò in SQL.

Ci sono alcuni trucchi del genere, quindi è necessario essere consapevoli di questo prima di definire la query EF.

EDIT

appena notato che la vostra prima query si avvale dei risultati della query durante la lettura dal dizionario. Così, dato che non si può effettivamente passare il dizionario nella query SQL, avrete probabilmente bisogno di recuperare tutti i record dal DB prima, quindi utilizzare LINQ-to-oggetti per eseguire il vostro controllo, come:

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

Il metodo ToArray() estrae l'intero set di risultati in memoria (esistono altri modi per farlo, ma in questo modo lo faccio di solito) e la seguente clausola Where viene eseguita in LINQ-to-objects anziché LINQ-to-Entities, significa che il tuo codice del dizionario funzionerà correttamente.

+0

risposta molto chiara, grazie – ren

Problemi correlati