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.

3voto

nzrytmn Punkte 4812

Alternativ können Sie auch wie folgt vorgehen:

var result = list1.Where(p => list2.All(x => x.Id != p.Id));

1voto

Inisheer Punkte 19775

Beispiel mit List of int der Einfachheit halber.

List<int> list1 = new List<int>();
// fill data
List<int> list2 = new List<int>();
// fill data

var results = from i in list1
              where !list2.Contains(i)
              select i;

foreach (var result in results)
    Console.WriteLine(result.ToString());

1voto

mshwf Punkte 6154

Für alle, die auch ein SQL-ähnliches System verwenden möchten IN Operator in C#, laden Sie dieses Paket herunter:

Mshwf.NiceLinq

Sie hat In et NotIn Methoden:

var result = list1.In(x => x.Email, list2.Select(z => z.Email));

Auch Sie können es auf diese Weise verwenden

var result = list1.In(x => x.Email, "a@b.com", "b@c.com", "c@d.com");

0voto

Tarik Punkte 10115

Ich habe dies nicht getestet mit LINQ zu Entitäten :

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

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

Alternativ dazu:

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

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

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

0voto

Marten Jacobs Punkte 169

Könnten Sie nicht eine äußere Verknüpfung durchführen und nur die Elemente aus der ersten Liste auswählen, wenn die Gruppe leer ist? Etwa so:

Dim result = (From a In list1
              Group Join b In list2 
                  On a.Value Equals b.Value 
                  Into grp = Group
              Where Not grp.Any
              Select a)

Ich bin nicht sicher, ob dies in irgendeiner Art von effizienter Weise mit dem Entity-Framework funktionieren würde.

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