Ich habe im Internet gesucht, kann aber immer noch keine einfache Antwort finden. Kann jemand bitte (in einfachem Englisch) erklären, was ein GroupJoin
ist? Wie unterscheidet es sich von einem normalen Inneren Join
? Wird es häufig verwendet? Ist es nur für die Methodensyntax? Was ist mit der Abfragesyntax? Ein c # -Codebeispiel wäre schön.
c#
linq
linq-to-entities
duyn9uyen
quelle
quelle
Antworten:
Verhalten
Angenommen, Sie haben zwei Listen:
Wenn Sie
Join
die beiden Listen auf demId
Feld haben, wird das Ergebnis sein:Wenn Sie
GroupJoin
die beiden Listen auf demId
Feld haben, wird das Ergebnis sein:So
Join
ergibt sich eine flache (tabellarische) Ergebnis von Eltern und Kind Werte.GroupJoin
Erzeugt eine Liste von Einträgen in der ersten Liste mit jeweils einer Gruppe von verbundenen Einträgen in der zweiten Liste.Aus diesem Grund
Join
entspricht diesINNER JOIN
SQL: Es gibt keine Einträge fürC
. WährendGroupJoin
ist das Äquivalent vonOUTER JOIN
:C
ist in der Ergebnismenge, aber mit einer leeren Liste verwandter Einträge (in einer SQL-Ergebnismenge würde es eine Zeile gebenC - null
).Syntax
Also lassen Sie die beiden Listen sein
IEnumerable<Parent>
undIEnumerable<Child>
jeweils. (Im Fall von Linq to Entities :)IQueryable<T>
.Join
Syntax wäreRückgabe eines
IEnumerable<X>
wobei X ein anonymer Typ mit zwei Eigenschaften ist,Value
undChildValue
. Diese Abfragesyntax verwendet dieJoin
Methode unter der Haube.GroupJoin
Syntax wäreRückgabe eines
IEnumerable<Y>
wobei Y ein anonymer Typ ist, der aus einer Eigenschaft des TypsParent
und einer Eigenschaft des Typs bestehtIEnumerable<Child>
. Diese Abfragesyntax verwendet dieGroupJoin
Methode unter der Haube.Wir könnten einfach
select g
in der letzteren AbfrageIEnumerable<IEnumerable<Child>>
eine Liste von Listen auswählen . In vielen Fällen ist die Auswahl mit dem übergeordneten Element nützlicher.Einige Anwendungsfälle
1. Herstellen einer flachen äußeren Verbindung.
Wie gesagt, die Aussage ...
... erstellt eine Liste der Eltern mit Kindergruppen. Dies kann durch zwei kleine Ergänzungen in eine flache Liste von Eltern-Kind-Paaren umgewandelt werden:
Das Ergebnis ist ähnlich wie
Beachten Sie, dass die Bereichsvariable
c
in der obigen Anweisung wiederverwendet wird. Auf diese Weise kann jedejoin
Anweisung einfach in eine konvertiert werden,outer join
indem das Äquivalentinto g from c in g.DefaultIfEmpty()
zu einer vorhandenenjoin
Anweisung hinzugefügt wird .Hier setzt die Abfragesyntax (oder umfassende Syntax) an. Die Methodensyntax (oder die fließende Syntax) zeigt, was wirklich passiert, aber es ist schwer zu schreiben:
Eine Wohnung
outer join
in LINQ ist also eineGroupJoin
, abgeflacht vonSelectMany
.2. Ordnung bewahren
Angenommen, die Liste der Eltern ist etwas länger. Einige Benutzeroberflächen erstellen eine Liste ausgewählter Eltern als
Id
Werte in einer festen Reihenfolge. Verwenden wir:Jetzt müssen die ausgewählten Eltern in genau dieser Reihenfolge aus der Elternliste herausgefiltert werden.
Wenn wir es tun ...
... bestimmt die Reihenfolge des
parents
Willens das Ergebnis. Wenn die Eltern von bestellt werdenId
, sind die Eltern 2, 3, 4, 7. Das Ergebnis ist nicht gut. Wir können jedoch auchjoin
die Liste filtern. Durch die Verwendungids
als erste Liste bleibt die Reihenfolge erhalten:Das Ergebnis sind die Eltern 3, 7, 2, 4.
quelle
Laut eduLINQ :
Der einzige Unterschied besteht in der Rückgabeerklärung:
Mitmachen :
GroupJoin :
Lesen Sie hier mehr:
Neuimplementieren von LINQ in Objekte: Teil 19 - Verbinden
Neuimplementieren von LINQ in Objekte: Teil 22 - GroupJoin
quelle