2011-10-03 7 views
6

tengo:LINQ to marco de la entidad: el uso del diccionario en la consulta

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

Esto produce el error

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

mientras que con las listas funciona:

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

Así es esta limitación de linq a EF o me estoy perdiendo algo?

Respuesta

10

Es la naturaleza de Entity Framework: cuando inserta expresiones en su consulta, hace todo lo posible para traducirlas a SQL, de modo que el trabajo se pueda realizar en el servidor.

En su primer ejemplo, intenta traducir la consulta y la llamada de recuperación del diccionario a SQL, y no puede, ya que no sabe cómo hacerlo.

En el segundo ejemplo, solo está pasando una lista a la consulta. Sí sabe cómo traducir eso en SQL.

Hay algunos inconvenientes, por lo que solo debes tenerlo en cuenta antes de definir tu consulta de EF.

EDITAR

he dado cuenta de que su primera consulta hace uso de los resultados de la consulta en la lectura del diccionario. Así como no se puede realmente pasar su diccionario en la consulta SQL, es probable que necesite para recuperar todos los registros de la base de datos en primer lugar, a continuación, utiliza LINQ a objetos para llevar a cabo su cheque, como:

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

El método ToArray() extrae todo el conjunto de resultados en la memoria (hay otras maneras de hacerlo, pero así es como generalmente lo hago), y la siguiente cláusula Where se ejecuta en LINQ-to-objects en lugar de LINQ-to-Entities, lo que significa que su código de diccionario se ejecutará bien.

+0

respuesta muy clara, gracias – ren

Cuestiones relacionadas