He buscado en la web pero todavía no puedo encontrar una respuesta simple. ¿Alguien puede explicar (en inglés simple) qué GroupJoin
es? ¿Cómo es diferente de un interior regular Join
? ¿Se usa comúnmente? ¿Es solo para la sintaxis del método? ¿Qué pasa con la sintaxis de consulta? Un ejemplo de código C # sería bueno.
c#
linq
linq-to-entities
duyn9uyen
fuente
fuente
Respuestas:
Comportamiento
Supongamos que tiene dos listas:
Cuando
Join
las dos listas en elId
campo el resultado será:Cuando
GroupJoin
las dos listas en elId
campo el resultado será:Entonces
Join
produce un resultado plano (tabular) de valores primarios y secundarios.GroupJoin
produce una lista de entradas en la primera lista, cada una con un grupo de entradas unidas en la segunda lista.Por eso
Join
es el equivalente deINNER JOIN
en SQL: no hay entradas paraC
. MientrasGroupJoin
es el equivalente deOUTER JOIN
:C
está en el conjunto de resultados, pero con una lista vacía de entradas relacionadas (en un conjunto de resultados de SQL habría una filaC - null
).Sintaxis
Entonces, que las dos listas sean
IEnumerable<Parent>
yIEnumerable<Child>
respectivamente. (En caso de Linq a Entidades:)IQueryable<T>
.Join
la sintaxis seríadevolviendo un
IEnumerable<X>
donde X es un tipo anónimo con dos propiedades,Value
yChildValue
. Esta sintaxis de consulta utiliza elJoin
método bajo el capó.GroupJoin
la sintaxis seríadevolviendo un
IEnumerable<Y>
donde Y es un tipo anónimo que consiste en una propiedad de tipoParent
y una propiedad de tipoIEnumerable<Child>
. Esta sintaxis de consulta utiliza elGroupJoin
método bajo el capó.Podríamos hacer
select g
en la última consulta, que seleccionaría unaIEnumerable<IEnumerable<Child>>
, digamos una lista de listas. En muchos casos, la selección con el padre incluido es más útil.Algunos casos de uso
1. Produciendo una unión externa plana.
Como se dijo, la declaración ...
... produce una lista de padres con grupos secundarios. Esto se puede convertir en una lista plana de pares padre-hijo mediante dos pequeñas adiciones:
El resultado es similar a
Tenga en cuenta que la variable de rango
c
se reutiliza en la declaración anterior. Al hacer esto, cualquierjoin
declaración simplemente se puede convertir en unaouter join
agregando el equivalente deinto g from c in g.DefaultIfEmpty()
unajoin
declaración existente .Aquí es donde brilla la sintaxis de consulta (o integral). La sintaxis del método (o fluido) muestra lo que realmente sucede, pero es difícil de escribir:
Entonces, un piso
outer join
en LINQ esGroupJoin
, aplanado porSelectMany
.2. Preservar el orden
Supongamos que la lista de padres es un poco más larga. Algunas IU producen una lista de padres seleccionados como
Id
valores en un orden fijo. Vamos a usar:Ahora los padres seleccionados deben filtrarse de la lista de padres en este orden exacto.
Si lo hacemos ...
... el orden de
parents
determinará el resultado. Si los padres son ordenados porId
, el resultado será padres 2, 3, 4, 7. No es bueno. Sin embargo, también podemos usarjoin
para filtrar la lista. Y al usarids
como primera lista, se preservará el orden:El resultado son los padres 3, 7, 2, 4.
fuente
De acuerdo con eduLINQ :
La única diferencia está en la declaración de devolución:
Unirse :
GroupJoin :
Leer más aquí:
Reimplementando LINQ a Objetos: Parte 19 - Únete
Reimplementar LINQ a objetos: Parte 22 - GroupJoin
fuente