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.
respuesta muy clara, gracias – ren