Ich habe zwei Sammlungen, die Eigentum Email
in beiden Sammlungen haben. Ich muss eine Liste der Elemente in der ersten Liste erhalten, Email
die in der zweiten Liste nicht vorhanden sind. Mit SQL würde ich nur "nicht in" verwenden, aber ich kenne das Äquivalent in LINQ nicht. Wie geht das?
Bisher habe ich einen Join, 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 beitreten, da ich den Unterschied brauche und der Beitritt fehlschlagen würde. Ich brauche eine Möglichkeit, Contains oder Exists zu verwenden, glaube ich. Ich habe nur noch kein Beispiel dafür gefunden.
Antworten:
Ich weiß nicht, ob das dir helfen wird, aber ..
von der NOT IN-Klausel in LINQ zu SQL von Marco Russo
quelle
Sie möchten den Operator Except.
Bessere Erklärung hier: https://docs.microsoft.com/archive/blogs/charlie/linq-farm-more-on-set-operators
HINWEIS: Diese Technik eignet sich am besten nur für primitive Typen, da Sie einen IEqualityComparer implementieren müssen , um die
Except
Methode mit komplexen Typen zu verwenden.quelle
list1.Select(item => new { Property1 = item.Property1, Property2 = item.Property2 }).Except(list2.Select( item => new { Property1 = item.Property1, Property2 = item.Property2 }));
Dies ist besonders nützlich, wenn Sie die Gleichheit bestimmen, indem Sie nur eine Reihe von Werten des komplexen Typs auswerten.IEquatityComparor<T,T>
Objektvergleichsmethoden in einemLinqToSql
Szenario zu implementieren oder zu überschreiben . denn die Abfrage wird als / kompiliert zu / ausgedrückt als SQL dargestellt; Somit werden die Werte überprüft, nicht die Objektreferenz.except
ich eine LINQ-Abfrage von 8-10 Sekunden auf eine halbe SekundeFür Leute, die mit einer Gruppe von In-Memory-Objekten beginnen und eine Datenbank abfragen, ist dies der beste Weg:
Dies erzeugt eine nette
WHERE ... IN (...)
Klausel in SQL.quelle
quelle
Sie können eine Kombination aus Wo und Beliebig verwenden, um nicht in:
quelle
Sie können beide Sammlungen in zwei verschiedenen Listen aufnehmen, z. B. Liste1 und Liste2.
Dann schreibe einfach
Das wird funktionieren.
quelle
In dem Fall, in dem man die verwendet Wenn Sie ADO.NET Entity Framework verwenden , funktioniert die EchoStorm-Lösung ebenfalls einwandfrei. Aber ich brauchte ein paar Minuten, um meinen Kopf darum zu wickeln. Angenommen, Sie haben einen Datenbankkontext, dc, und möchten Zeilen in Tabelle x finden, die nicht in Tabelle y verknüpft sind, sieht die vollständige Antwort wie folgt aus:
Als Antwort auf Andys Kommentar kann man in einer LINQ-Abfrage zwei von haben. Hier ist ein vollständiges Arbeitsbeispiel mit Listen. Jede Klasse, Foo und Bar, hat eine ID. Foo hat einen "Fremdschlüssel" -Referenz auf Bar über Foo.BarId. Das Programm wählt alle Foo's aus, die nicht mit einer entsprechenden Leiste verknüpft sind.
quelle
quelle
Man könnte es auch gebrauchen
All()
quelle
Während dies
Except
Teil der Antwort ist, ist es nicht die ganze Antwort. Standardmäßig führtExcept
(wie einige der LINQ-Operatoren) einen Referenzvergleich für Referenztypen durch. Um nach Werten in den Objekten zu vergleichen, müssen SieIEquatable<T>
in Ihrem Typ , oderEquals
undGetHashCode
in Ihrem Typ, oderIEqualityComparer<T>
für Ihren Typ implementiert istquelle
Beispiel zur Vereinfachung der Liste von int.
quelle
IN
Laden Sie dieses Paket herunter, wenn Sie auch einen SQL-ähnlichen Operator in C # verwenden möchten:Es hat
In
undNotIn
Methoden:Auch Sie können es auf diese Weise verwenden
quelle
Danke, Brett. Ihr Vorschlag hat mir auch geholfen. Ich hatte eine Liste von Objekten und wollte diese anhand einer anderen Liste von Objekten filtern. Danke noch einmal....
Wenn jemand etwas braucht, schauen Sie sich bitte mein Codebeispiel an:
quelle
Ich habe dies nicht mit LINQ to Entities getestet :
Alternative:
quelle
Könnten Sie keine äußere Verknüpfung durchführen und nur die Elemente aus der ersten Liste auswählen, wenn die Gruppe leer ist? Etwas wie:
Ich bin mir nicht sicher, ob dies mit dem Entity-Framework auf irgendeine effiziente Weise funktionieren würde.
quelle
Alternativ können Sie Folgendes tun:
quelle