J'ai deux collections qui ont des propriétés Email
dans les deux collections. J'ai besoin d'obtenir une liste des éléments de la première liste où Email
n'existe pas dans la deuxième liste. Avec SQL, j'utiliserais simplement "pas dans", mais je ne connais pas l'équivalent dans LINQ. Comment cela se fait-il?
Jusqu'à présent, j'ai une jointure, comme ...
var matches = from item1 in list1
join item2 in list2 on item1.Email equals item2.Email
select new { Email = list1.Email };
Mais je ne peux pas rejoindre car j'ai besoin de la différence et la jointure échouerait. J'ai besoin d'une manière d'utiliser Contains ou Exists, je crois. Je n'ai tout simplement pas encore trouvé d'exemple pour le faire.
Réponses:
Je ne sais pas si ça va t'aider mais ..
de la clause NOT IN dans LINQ to SQL par Marco Russo
la source
Vous voulez l'opérateur Except.
Meilleure explication ici: https://docs.microsoft.com/archive/blogs/charlie/linq-farm-more-on-set-operators
REMARQUE: cette technique fonctionne mieux pour les types primitifs uniquement, car vous devez implémenter un IEqualityComparer pour utiliser la
Except
méthode avec des types complexes.la source
list1.Select(item => new { Property1 = item.Property1, Property2 = item.Property2 }).Except(list2.Select( item => new { Property1 = item.Property1, Property2 = item.Property2 }));
ceci est particulièrement utile lorsque vous déterminez l'égalité en évaluant uniquement un ensemble de valeurs de type complexe.IEquatityComparor<T,T>
ou de remplacer des méthodes de comparaison d'objets dans unLinqToSql
scénario; pour, la requête sera représentée comme / compilée en / exprimée en SQL; ainsi les valeurs seront vérifiées, pas la référence d'objet.except
j'ai pu accélérer une requête LINQ de 8 à 10 secondes à une demi-secondePour les personnes qui commencent par un groupe d'objets en mémoire et interrogent une base de données, j'ai trouvé que c'était la meilleure façon de procéder:
Cela produit une belle
WHERE ... IN (...)
clause en SQL.la source
la source
Vous pouvez utiliser une combinaison de Où et de Tout pour ne pas trouver dans:
la source
Vous pouvez regrouper les deux collections dans deux listes différentes, par exemple list1 et list2.
Alors écrivez
Cela fonctionnera.
la source
Dans le cas où l'on utilise ADO.NET Entity Framework , la solution d'EchoStorm fonctionne également parfaitement. Mais il m'a fallu quelques minutes pour m'enrouler autour de la tête. En supposant que vous avez un contexte de base de données, dc, et que vous souhaitez trouver des lignes dans le tableau x non liées dans le tableau y, la réponse complète de la réponse ressemble à:
En réponse au commentaire d'Andy, oui, on peut avoir deux from dans une requête LINQ. Voici un exemple de travail complet, utilisant des listes. Chaque classe, Foo et Bar, a un identifiant. Foo a une référence de "clé étrangère" à Bar via Foo.BarId. Le programme sélectionne tous les Foo non liés à une barre correspondante.
la source
la source
On pourrait également utiliser
All()
la source
Bien que cela
Except
fasse partie de la réponse, ce n'est pas la réponse entière. Par défaut,Except
(comme plusieurs des opérateurs LINQ) effectue une comparaison de référence sur les types de référence. Pour comparer par valeurs dans les objets, vous devrezIEquatable<T>
dans votre type, ouEquals
etGetHashCode
dans votre type, ouIEqualityComparer<T>
pour votre typela source
Exemple utilisant List of int pour plus de simplicité.
la source
Pour tous ceux qui souhaitent également utiliser un
IN
opérateur similaire à SQL en C #, téléchargez ce package:Il a
In
etNotIn
méthodes:Même vous pouvez l'utiliser de cette façon
la source
Merci, Brett. Votre suggestion m'a également aidé. J'avais une liste d'objets et je voulais filtrer cela en utilisant une autre liste d'objets. Merci encore....
Si quelqu'un a besoin, veuillez consulter mon exemple de code:
la source
Je n'ai pas testé cela avec LINQ to Entities :
Alternativement:
la source
Impossible de faire une jointure externe, en sélectionnant uniquement les éléments de la première liste si le groupe est vide? Quelque chose comme:
Je ne sais pas si cela fonctionnerait d'une manière efficace avec le cadre Entity.
la source
Vous pouvez également faire comme ceci:
la source