Saltar al contenido

Como hacer un group by en linq c#

Group by en linq es muy parecido al usado en sql pero con las expresiones lamdas que ya concemos podemos hacer todo lo que conocesmo hasta el momento en sql desde C#.

En este articulo conoceremos como funciona el groupby de linq con ejemplos y una aplicacion para descargar.

Índice

    Como funciona el group by de linq?

    En LINQ, la agrupación de elementos se logra a través del método GroupBy(). El método GroupBy() puede tomar uno o más parámetros; sin embargo, para comenzar a entender cómo funciona es importante empezar por las situaciones donde solo se necesita un parámetro.

    CRUD base de datos

    Sintaxis linq C# group by

    La sintaxis básica de group by en LINQ es definir el atributo que utilizará para agrupar los elementos y luego el tipo de datos devueltos por groupby:

    `var group = listaElementos.GroupBy(elemento => elemento.Atributo)`

    Donde «elemento» se refiere al objeto iterado en la lista de elementos (p.e., un pedido, un cliente, etc.), y «atributo» es el campo a partir del cual los datos serán agrupados.

    El group by LINQ devuelve un nuevo objeto que contiene los resultados agrupados por el atributo que indicamos, para luego poder acceder a sus propiedades e información; de esta manera, podemos obtener resultados útiles como por ejemplo, conocer los pedidos de cada uno de los clientes.

    Su sintaxis es la siguiente:

    var agrupacion = from p in listaPedido

                     group p by p.productoid into grupo

                     select grupo;

    El resultado, seria una lista de grupos, donde cada grupo contiene los elementos agrupados por el atributo que especificamos. como vermos es importa el uso del select en linq para completar la consulta.

    Foreach Linq group by

    En consecuencia, podemos organizar fácilmente dos bucles foreach para recorrer con el primero la lista de claves por las que se agrupa (grupo.Key) y usar el ciclo interno para explorar la lista de objetos que cumplen con los criterios de grupos:

    foreach (var grupo in agrupacion)

    {

        Console.WriteLine("ID producto: " + grupo.Key);

        foreach (var objetoAgrupado in grupo)

            Console.Write("\t\tPedido nº " + objetoAgrupado.Id + ": " + objetoAgrupado.FechaPedido + "]" + Environment.NewLine);

    }

    El resultado seria :

    ID producto: 1

             Pedido nº 39: 13/08/2019

             Pedido nº 41: 21/08/2019

    ID producto: 2

              Pedido Nº 40: 15/08/2019] etc.

    Con group by LINQ podemos agrupar elementos y obtener datos útiles para nuestras aplicaciones, lo que nos permite analizar y realizar predicciones con los datos que tenemos.

    Expresiones aritmeticas con linq Sum, Count Avg, Min Max

    en linq podemos no solo agrupar por un campo sino que tambien podemos usar expresiones aritmeticas para calcular ciertos valores de nuestros registros. tal como hacemos en sql group by la sintaxis para esto seria.

    Ejemplo linq count

    var group = listaElementos.GroupBy(elemento => elemento.Atributo)

                     .Select (g => new {

                               campoAgrupado = g.Key,

                               Contador = g.Count()

                        });

    Esto nos da como resultado un nuevo objeto con la cantidad de los elementos agrupados por el atributo que especificamos . los demas metodos serian igualmente simples te recomiendo aprender como funcion el having count de sql.

    Ejemplo linq max

    var group = listaElementos.GroupBy(elemento => elemento.Atributo)

                     .Select (g => new {

                               campoAgrupado = g.Key,

                               Maximo = g.Max()

                        });

    Esto nos devuelve el valor maximo de los elementos agrupados por el atributo especificado . en este caso seria el valor mas alto de cada grupo de elementos agrupados. para mas informacion te recomiendo ver como funcion la funcion max

    Ejemplo linq sum

    var group = listaElementos.GroupBy(elemento => elemento.Atributo)

                     .Select (g => new {

                               campoAgrupado = g.Key,

                               Suma = g.Sum()

                        });

    Esto devuelve la sumatoria de los valores de los elementos agrupados por el atributo especificado .

    Usando funcion average en linq

    var group = listaElementos.GroupBy(elemento => elemento.Atributo)

                     .Select (g => new {

                               campoAgrupado = g.Key,

                               Promedio = g.Average()

                        });

    Esto devuelve el promedio de los valores de los elementos agrupados por el atributo especificado .

    Agrupar por mas de una columna

    En linq al igual que en sql los group by se puede utilizar con mas de una columna para hacer esto tenemos que indicarle a group by los atributos que queremos utilizar para hacer el agrupamiento

    Ejemplo group linq Por Mas De Una Columna

    var group = listaElementos.GroupBy(elemento => new { elemento.AtributoA, elemento.Atributob})

                     .Select (g => new {

                               camposAgrupados = g.Key,

                               Suma = g.Sum()

                        });

    Esta expresion nos devuelve un objeto con la sumatoria de los valores de los elementos agrupados por atributoA y atributoB.

    Descargar aplicacion con ejemplos

    Esta aplicacion te permitira practicar desde visual studio o cualquier otro ide de tu preferencia como funcinan los group by de linq.

    Con group by LINQ podemos agrupar elementos, realizar operaciones aritméticas con ellos y obtener información útil para nuestras aplicaciones. Esta técnica nos ayuda a analizar la información que poseemos para sacar conclusiones y tomar mejores decisiones basadas en los datos. ¡Intenta utilizando group by LINQ para descubrir nuevos patrones en tu código!

    Hasta la proxima !!

    Gracias :D!!