325 votes

Comment voulez-vous faire un "pas dans la" requête Linq?

J'ai 2 collections qui ont un e-Mail de la propriété dans les deux collections. J'ai besoin d'obtenir une liste des éléments de la première liste où l'e-Mail n'existe pas dans la deuxième liste. Avec SQL, je voudrais juste utiliser "non" mais je ne sais pas l'équivalent dans Linq.

Comment est-ce fait?

Pour l'instant 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 peut pas participer car j'ai besoin de la différence et de la jointure serait un échec. J'ai besoin de l'aide Contient ou Existe, je crois. J'ai juste pas trouvé un exemple pour le faire encore.

343voto

Echostorm Points 4824

Vous voulez l'Exception de l'opérateur.

var answer = list1.Except(list2);

Une meilleure explication ici: http://blogs.msdn.com/charlie/archive/2008/07/12/the-linq-set-operators.aspx

REMARQUE: Cette technique fonctionne pour les types primitifs, puisque vous avez à mettre en œuvre un iEqualityComparor à utiliser à l'Exception de la méthode avec des types complexes.

318voto

Robert Rouse Points 2488

Je ne sais pas si cela va vous aider mais..

NorthwindDataContext dc = new NorthwindDataContext();    
dc.Log = Console.Out;

var query =    
    from c in dc.Customers    
    where !(from o in dc.Orders    
            select o.CustomerID)    
           .Contains(c.CustomerID)    
    select c;

foreach (var c in query) Console.WriteLine( c );

de Le PAS DANS la clause de LINQ to SQL par Marco Russo

69voto

StriplingWarrior Points 56276

Pour les personnes qui commencent avec un groupe d'objets en mémoire et sont de l'interrogation d'une base de données, j'ai trouvé que c'était la meilleure façon de le faire (.NET 4.0 uniquement):

var itemIds = inMemoryList.Select(x => x.Id).ToArray();
var otherObjects = context.ItemList.Where(x => !itemIds.Contains(x.Id));

Cela produit un gentil WHERE ... IN (...) clause SQL.

61voto

David B Points 53123

les éléments de la première liste où l'e-Mail n'existe pas dans la deuxième liste.

from item1 in List1
where !(list2.Any(item2 => item2.Email == item1.Email))
select item1;

7voto

Chintan Udeshi Points 61

Vous pouvez prendre à la Fois les Collections dans 2 Différents pour dire list1 et list2

ensuite, il suffit d'écrire

list1.RemoveAll(Item => list2.Contains(Item));

cela fonctionne

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X