He buscado en la web pero todavía no puedo encontrar una respuesta simple. ¿Alguien puede explicar (en inglés simple) qué GroupJoines? ¿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
Joinlas dos listas en elIdcampo el resultado será:Cuando
GroupJoinlas dos listas en elIdcampo el resultado será:Entonces
Joinproduce un resultado plano (tabular) de valores primarios y secundarios.GroupJoinproduce una lista de entradas en la primera lista, cada una con un grupo de entradas unidas en la segunda lista.Por eso
Joines el equivalente deINNER JOINen SQL: no hay entradas paraC. MientrasGroupJoines el equivalente deOUTER JOIN:Cestá 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>.Joinla sintaxis seríadevolviendo un
IEnumerable<X>donde X es un tipo anónimo con dos propiedades,ValueyChildValue. Esta sintaxis de consulta utiliza elJoinmétodo bajo el capó.GroupJoinla sintaxis seríadevolviendo un
IEnumerable<Y>donde Y es un tipo anónimo que consiste en una propiedad de tipoParenty una propiedad de tipoIEnumerable<Child>. Esta sintaxis de consulta utiliza elGroupJoinmétodo bajo el capó.Podríamos hacer
select gen 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
cse reutiliza en la declaración anterior. Al hacer esto, cualquierjoindeclaración simplemente se puede convertir en unaouter joinagregando el equivalente deinto g from c in g.DefaultIfEmpty()unajoindeclaració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 joinen 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
Idvalores 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
parentsdeterminará el resultado. Si los padres son ordenados porId, el resultado será padres 2, 3, 4, 7. No es bueno. Sin embargo, también podemos usarjoinpara filtrar la lista. Y al usaridscomo 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