Tengo dos colecciones que tienen propiedades Email
en ambas colecciones. Necesito obtener una lista de los elementos en la primera lista donde Email
no existe en la segunda lista. Con SQL simplemente usaría "no en", pero no sé el equivalente en LINQ. ¿Cómo se hace eso?
Hasta ahora tengo una unión, como ...
var matches = from item1 in list1
join item2 in list2 on item1.Email equals item2.Email
select new { Email = list1.Email };
Pero no puedo unirme porque necesito la diferencia y la unión fallaría. Necesito alguna forma de usar Contiene o Existe, creo. Simplemente no he encontrado un ejemplo para hacerlo todavía.
Respuestas:
No sé si esto te ayudará pero ...
de la cláusula NOT IN en LINQ a SQL por Marco Russo
fuente
Desea el operador Excepto.
Mejor explicación aquí: https://docs.microsoft.com/archive/blogs/charlie/linq-farm-more-on-set-operators
NOTA: Esta técnica funciona mejor solo para tipos primitivos, ya que debe implementar un IEqualityComparer para usar el
Except
método con tipos complejos.fuente
list1.Select(item => new { Property1 = item.Property1, Property2 = item.Property2 }).Except(list2.Select( item => new { Property1 = item.Property1, Property2 = item.Property2 }));
Esto es particularmente útil cuando se determina la igualdad al evaluar solo un conjunto de valores del tipo complejo.IEquatityComparor<T,T>
o anular los métodos de comparación de objetos en unLinqToSql
escenario; para, la consulta se representará como / compilado a / expresado como SQL; así se verificarán los valores, no la referencia del objeto.except
pude acelerar una consulta LINQ de 8-10 segundos a medio segundoPara las personas que comienzan con un grupo de objetos en memoria y realizan consultas en una base de datos, he encontrado que esta es la mejor manera de hacerlo:
Esto produce una bonita
WHERE ... IN (...)
cláusula en SQL.fuente
fuente
Puede usar una combinación de Where y Any para encontrar no en:
fuente
Puede tomar ambas colecciones en dos listas diferentes, digamos list1 y list2.
Entonces solo escribe
Esto funcionará
fuente
En el caso de que uno esté usando el Marco de entidades ADO.NET , la solución de EchoStorm también funciona perfectamente. Pero me llevó unos minutos entenderlo. Suponiendo que tiene un contexto de base de datos, cc, y desea encontrar filas en la tabla x no vinculadas en la tabla y, la respuesta de respuesta completa se ve así:
En respuesta al comentario de Andy, sí, uno puede tener dos de en una consulta LINQ. Aquí hay un ejemplo de trabajo completo, usando listas. Cada clase, Foo y Bar, tiene una identificación. Foo tiene una referencia de "clave externa" a Bar a través de Foo.BarId. El programa selecciona todos los Foo no vinculados a una barra correspondiente.
fuente
fuente
También se podría usar
All()
fuente
Si bien
Except
es parte de la respuesta, no es la respuesta completa. Por defecto,Except
(como varios de los operadores LINQ) hace una comparación de referencia en los tipos de referencia. Para comparar por valores en los objetos, deberáIEquatable<T>
en su tipo, oEquals
yGetHashCode
en su tipo, oIEqualityComparer<T>
para su tipofuente
Ejemplo usando List of int por simplicidad.
fuente
Para cualquiera que también quiera usar un
IN
operador similar a SQL en C #, descargue este paquete:Tiene
In
yNotIn
métodos:Incluso puedes usarlo de esta manera
fuente
Gracias Brett Tu sugerencia también me ayudó. Tenía una lista de objetos y quería filtrar eso usando otra lista de objetos. Gracias de nuevo....
Si alguien lo necesita, eche un vistazo a mi ejemplo de código:
fuente
No probé esto con LINQ to Entities :
Alternativamente:
fuente
¿No podría hacer una unión externa, solo seleccionando los elementos de la primera lista si el grupo está vacío? Algo como:
No estoy seguro de si esto funcionaría de alguna manera eficiente con el marco Entity.
fuente
Alternativamente, puede hacer así:
fuente