J'ai effectué une recherche sur le Web, mais je ne trouve toujours pas de réponse simple. Quelqu'un peut-il expliquer (en anglais simple) ce qu'est un GroupJoin
? En quoi est-ce différent d'un intérieur ordinaire Join
? Est-il couramment utilisé? Est-ce uniquement pour la syntaxe de méthode? Qu'en est-il de la syntaxe des requêtes? Un exemple de code c # serait bien.
c#
linq
linq-to-entities
duyn9uyen
la source
la source
Réponses:
Comportement
Supposons que vous ayez deux listes:
Lorsque vous
Join
les deux listes sur leId
terrain, le résultat sera:Lorsque vous
GroupJoin
les deux listes sur leId
terrain, le résultat sera:Produit donc
Join
un résultat plat (tabulaire) des valeurs parent et enfant.GroupJoin
produit une liste d'entrées dans la première liste, chacune avec un groupe d'entrées jointes dans la seconde liste.C'est pourquoi
Join
est l'équivalent deINNER JOIN
SQL: il n'y a pas d'entrées pourC
. WhileGroupJoin
est l'équivalent deOUTER JOIN
:C
est dans le jeu de résultats, mais avec une liste vide d'entrées associées (dans un jeu de résultats SQL, il y aurait une ligneC - null
).Syntaxe
Alors laissez les deux listes être
IEnumerable<Parent>
etIEnumerable<Child>
respectivement. (Dans le cas de Linq aux entités:)IQueryable<T>
.Join
la syntaxe seraitrenvoyer un
IEnumerable<X>
où X est un type anonyme avec deux propriétés,Value
etChildValue
. Cette syntaxe de requête utilise laJoin
méthode sous le capot.GroupJoin
la syntaxe seraitrenvoyant un
IEnumerable<Y>
où Y est un type anonyme composé d'une propriété de typeParent
et d'une propriété de typeIEnumerable<Child>
. Cette syntaxe de requête utilise laGroupJoin
méthode sous le capot.Nous pourrions simplement faire
select g
dans la dernière requête, qui sélectionnerait uneIEnumerable<IEnumerable<Child>>
, disons une liste de listes. Dans de nombreux cas, la sélection avec le parent inclus est plus utile.Quelques cas d'utilisation
1. Produire une jointure extérieure plate.
Comme dit, la déclaration ...
... produit une liste de parents avec des groupes d'enfants. Cela peut être transformé en une liste plate de paires parent-enfant par deux petits ajouts:
Le résultat est similaire à
Notez que la variable de plage
c
est réutilisée dans l'instruction ci-dessus. En faisant cela, toutejoin
instruction peut simplement être convertie en unouter join
en ajoutant l'équivalent deinto g from c in g.DefaultIfEmpty()
à unejoin
instruction existante .C'est là que brille la syntaxe de requête (ou complète). La syntaxe de méthode (ou couramment) montre ce qui se passe réellement, mais c'est difficile à écrire:
Donc, un appartement
outer join
dans LINQ est unGroupJoin
, aplati parSelectMany
.2. Maintenir l'ordre
Supposons que la liste des parents soit un peu plus longue. Certaines interfaces utilisateur produisent une liste de parents sélectionnés sous forme de
Id
valeurs dans un ordre fixe. Utilisons:Désormais, les parents sélectionnés doivent être filtrés de la liste des parents dans cet ordre exact.
Si nous faisons ...
... l'ordre de
parents
déterminera le résultat. Si les parents sont commandés parId
, le résultat sera les parents 2, 3, 4, 7. Pas bien. Cependant, nous pouvons également utiliserjoin
pour filtrer la liste. Et en utilisantids
comme première liste, l'ordre sera conservé:Le résultat est les parents 3, 7, 2, 4.
la source
Selon eduLINQ :
La seule différence est dans l'instruction de retour:
Rejoindre :
GroupJoin :
En savoir plus ici:
Réimplémentation de LINQ to Objects: Partie 19 - Joindre
Réimplémentation de LINQ to Objects: Partie 22 - GroupJoin
la source