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).

¿Fue útil?

Solución

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top