Angenommen, ich habe eine linke äußere Verknüpfung als solche:
from f in Foo
join b in Bar on f.Foo_Id equals b.Foo_Id into g
from result in g.DefaultIfEmpty()
select new { Foo = f, Bar = result }
Wie würde ich dieselbe Aufgabe mit Erweiterungsmethoden ausdrücken? Z.B
Foo.GroupJoin(Bar, f => f.Foo_Id, b => b.Foo_Id, (f,b) => ???)
.Select(???)
c#
linq-to-sql
lambda
LaserJesus
quelle
quelle
GroupJoin
wird die linke äußere Verbindung hergestellt, dasSelectMany
Teil wird nur benötigt, je nachdem, was Sie auswählen möchten.Da dies die De-facto-SO-Frage für Linksaußenverknüpfungen unter Verwendung der Methodensyntax (Erweiterungssyntax) zu sein scheint, dachte ich, ich würde eine Alternative zu der aktuell ausgewählten Antwort hinzufügen, die (zumindest nach meiner Erfahrung) häufiger das war, was ich bin nach dem
So zeigen Sie den Unterschied mithilfe eines einfachen Datensatzes an (vorausgesetzt, wir verbinden die Werte selbst):
Option 2 entspricht der typischen linken äußeren Verknüpfungsdefinition, ist jedoch, wie bereits erwähnt, je nach Datensatz häufig unnötig komplex.
quelle
Single
Prüfung während eines Joins nicht einfach durchführen können .SingleOrDefault
Dies ist jedoch eine "korrektere" Methode, um diese IMO zu demonstrieren.Die Gruppenverbindungsmethode ist nicht erforderlich, um die Verknüpfung zweier Datensätze zu erreichen.
Inner Join:
Für Left Join fügen Sie einfach DefaultIfEmpty () hinzu
EF und LINQ to SQL werden korrekt in SQL umgewandelt. Für LINQ to Objects ist es besser, mit GroupJoin beizutreten, da es intern Lookup verwendet . Wenn Sie jedoch DB abfragen, ist das Überspringen von GroupJoin AFAIK als Performant.
Personlay ist für mich auf diese Weise besser lesbar als GroupJoin (). SelectMany ()
quelle
Sie können eine Erweiterungsmethode erstellen wie:
quelle
Um die Antwort von Ocelot20 zu verbessern: Wenn Sie eine Tabelle haben, bei der Sie nur noch 0 oder 1 Zeilen davon haben möchten, die jedoch mehrere Zeilen enthalten können, müssen Sie Ihre verknüpfte Tabelle bestellen:
Andernfalls ist die Zeile, die Sie im Join erhalten, zufällig (oder genauer gesagt, je nachdem, was die Datenbank zuerst findet).
quelle
Als ich Marc Gravells Antwort in eine Erweiterungsmethode verwandelte, machte ich Folgendes.
quelle
Obwohl die akzeptierte Antwort funktioniert und für Linq to Objects gut ist, hat es mich gestört, dass die SQL-Abfrage nicht nur ein direkter Left Outer Join ist.
Der folgende Code basiert auf dem LinkKit-Projekt , mit dem Sie Ausdrücke übergeben und für Ihre Abfrage aufrufen können.
Es kann wie folgt verwendet werden
quelle
Hierfür gibt es eine einfache Lösung
Verwenden Sie einfach .HasValue in Ihrer Auswahl
Sehr einfach, keine Notwendigkeit für Gruppenbeiträge oder irgendetwas anderes
quelle