Cómo usar colecciones genéricas junto con LINQ-to-entidades
-
03-07-2019 - |
Pregunta
Tengo problemas para convertir la siguiente declaración SQL en LINQ-to-entidades:
SELECT l.*
FROM locations l
WHERE l.id NOT IN (/* array of ids */)
En LINQ, me gustaría ver algo como (donde myCollection es una lista genérica de elementos que se excluirán):
IQueryable<Location> locationQuery = from l in DataContext.Location
where !myCollection.Contains(l)
select l;
Pero eso no funcionará porque Contains no está disponible en LINQ-to-enters (como lo veo). En mi intento LINQ mejor / más cercano, tengo mi colección de Ubicaciones (una Lista) y tengo un DataContext que recupera todas las Ubicaciones existentes de la base de datos:
List<Location> Route = new List<Location>();
// Some code to add Location entities from the DB to the Route collection
var innerQuery = from p in Route
select p.ID;
IQueryable<Location> locationQuery = from l in DataContext.Location
where !((innerQuery).Any(k => k == l.ID))
select l;
Obviamente, quiero obtener todas las ubicaciones de la base de datos que no están en mi colección local. Sin embargo, el código generará una NotSupportedException indicando:
No se puede crear un valor constante de tipo 'Tipo de cierre'. En este contexto solo se admiten los tipos primitivos ('como Int32, String y Guid').
He jugado con eso, utilizando diferentes enfoques, pero simplemente no puedo hacer que funcione. Ahora he leído que LINQ-to-entity no es capaz de comparaciones de alto nivel (nivel de objeto) que podrían explicar el error anterior.
Mi pregunta real es, ¿cómo hago en LINQ lo que puedo hacer tan fácilmente en SQL? Solo quiero seleccionar un grupo de entidades de la base de datos, excluyendo las entidades presentes en la colección local (no DB).
Solución
Prueba esta publicación: " NO EN " Cláusula en LINQ para Entidades