349 Stimmen

Wie würden Sie eine "nicht in" Abfrage mit LINQ tun?

Ich habe zwei Sammlungen, die die Eigenschaft Email in beiden Sammlungen. Ich muss eine Liste der Elemente in der ersten Liste erhalten, in der Email ist in der zweiten Liste nicht vorhanden. Bei SQL würde ich einfach "not in" verwenden, aber ich kenne die Entsprechung in LINQ nicht. Wie wird das gemacht?

Bis jetzt habe ich eine Verbindung, wie...

var matches = from item1 in list1
join item2 in list2 on item1.Email equals item2.Email
select new { Email = list1.Email };

Aber ich kann nicht verbinden, da ich die Differenz brauche und die Verbindung fehlschlagen würde. Ich brauche eine Möglichkeit, Contains oder Exists ich glaube zu verwenden. Ich habe nur noch kein Beispiel gefunden, um das zu tun.

361voto

Echostorm Punkte 9442

Sie wollen den "Except operator".

var answer = list1.Except(list2);

Hier eine bessere Erklärung: https://docs.microsoft.com/archive/blogs/charlie/linq-farm-more-on-set-operators

HINWEIS: Diese Technik funktioniert am besten nur für primitive Typen, da Sie eine IEqualityComparer zur Nutzung der Except Methode mit komplexen Typen.

338voto

Robert Rouse Punkte 4721

Ich weiß nicht, ob Ihnen das weiterhilft, aber

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

からして Die NOT IN-Klausel in LINQ to SQL von Marco Russo

76voto

StriplingWarrior Punkte 141402

Für Leute, die mit einer Gruppe von In-Memory-Objekten beginnen und eine Datenbank abfragen, ist dies meiner Meinung nach der beste Weg:

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

Dies ergibt ein schönes WHERE ... IN (...) Klausel in SQL.

62voto

Amy B Punkte 104656

Einträge in der ersten Liste, wenn die E-Mail nicht in der zweiten Liste vorhanden ist.

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

21voto

DevT Punkte 4545

Sie können eine Kombination aus Where und Any für die Suche nach not in verwenden:

var NotInRecord =list1.Where(p => !list2.Any(p2 => p2.Email  == p.Email));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X