Linq to entities rejoindre vs groupjoin
J'ai web cherché mais je ne trouve pas de réponse simple. Quelqu'un peut-il expliquer (en anglais) ce qu'est un GroupJoin
est? Comment est-il différent d'un régulier intérieure Join
? Il est couramment utilisé? Est-il seulement pour la méthode de la syntaxe? Ce à propos de la syntaxe de la requête? Un exemple de code c#, ce serait bien.
- Selon MSDN, un groupe de jointure est une jointure dans la clause avec une dans l'expression. clause de jointure a plus d'informations et des exemples de code. Il s'agit essentiellement d'une jointure interne (si pas d'éléments dans le bon match de toute la gauche, vous obtenez un résultat null); cependant, le résultat est organisée en groupes.
Vous devez vous connecter pour publier un commentaire.
Comportement
Supposons que vous avez deux listes:
Lorsque vous
Join
les deux listes sur leId
champ, le résultat sera:Lorsque vous
GroupJoin
les deux listes sur leId
champ, le résultat sera:Donc
Join
produit d'une télévision (tabulaire) résultat de parent et de l'enfant les valeurs.GroupJoin
produit une liste d'entrées dans la première liste, chacun avec un groupe d'entrées jointes dans la deuxième liste.C'est pourquoi
Join
est l'équivalent deINNER JOIN
en SQL: il n'y a pas d'entrées pourC
. Alors queGroupJoin
est l'équivalent deOUTER JOIN
:C
est dans le jeu de résultats, mais avec une liste vide d'entrées connexes (dans un SQL ensemble de résultats, il y aurait une ligneC - null
).Syntaxe
Alors laissez les deux listes sont
IEnumerable<Parent>
etIEnumerable<Child>
respectivement. (En cas de Linq to entities:IQueryable<T>
).Join
syntaxe seraitretour d'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
syntaxe seraitretour d'un
IEnumerable<Y>
où Y est un type anonyme constituée d'une propriété de typeParent
et une propriété de typeIEnumerable<Child>
. Cette syntaxe de requête utilise laGroupJoin
méthode sous le capot.Nous pouvons juste faire
select g
dans la dernière question, qui serait de sélectionner unIEnumerable<IEnumerable<Child>>
, dire une liste de listes. Dans de nombreux cas, la sélectionner avec le parent inclus est plus utile.Certains cas d'utilisation
1. La production d'un plat de jointure externe.
Comme l'a dit, la déclaration ...
... produit une liste de parents avec les groupes d'enfants. Cela peut être transformé en une liste à plat de parent-enfant paires par deux petits ajouts:
Le résultat est similaire à
Noter que le variable de portée
c
est réutilisé dans la déclaration ci-dessus. Ce faisant, toutjoin
instruction peut simplement être converti enouter join
en ajoutant l'équivalent deinto g from c in g.DefaultIfEmpty()
à unjoin
déclaration.C'est là que la requête (ou complète) de la syntaxe brille. Méthode (ou fluide) syntaxe montre ce qui se passe vraiment, mais il est difficile d'écrire:
Donc un plat
outer join
dans LINQ est unGroupJoin
, aplatie parSelectMany
.2. Le maintien de l'ordre
Supposons que la liste des parents est un peu plus long. Une INTERFACE utilisateur produit une liste de parents sélectionnés comme
Id
valeurs dans un ordre fixe. Nous allons utiliser:Maintenant, les parents sélectionnés doivent être filtrées par les parents liste dans l'ordre exact.
Si nous ne ...
... l'ordre de
parents
déterminera le résultat. Si les parents sont commandés parId
, le résultat sera parents, 2, 3, 4, 7. Pas bonne. Cependant, nous pouvons également utiliserjoin
pour filtrer la liste. Et en utilisantids
comme première liste, la commande sera conservée:Le résultat est que les parents de 3, 7, 2, 4.
Selon eduLINQ:
La seule différence est dans l'instruction de retour:
Rejoindre:
GroupJoin:
Lire la suite ici:
Réimplanter LINQ to Objects: Partie 19 - Rejoindre
Réimplanter LINQ to Objects: Partie 22 - GroupJoin