martes, 22 de marzo de 2016

GroupBy usando expresiones lambda

A continuación, voy a mostrarles como utilizar GroupBy con expresiones lambda. Para estos ejemplos se utilizará la siguiente lista:

Dim lista As New List(Of Object)
lista.Add(New With {.ANIO = 2014, .NUMERO = "1521", .SUELDO = 10})
lista.Add(New With {.ANIO = 2015, .NUMERO = "1521", .SUELDO = 20})
lista.Add(New With {.ANIO = 2015, .NUMERO = "1522", .SUELDO = 5})
lista.Add(New With {.ANIO = 2015, .NUMERO = "1522", .SUELDO = 5})

Caso 1: Agrupación por solo un campo + operador adicional
en el siguiente ejemplo se obtiene la suma de "Sueldos" por año.

Dim p1 = lista.GroupBy(Function(g) g.ANIO).Select(Function(a) New With {.numero = a.Key,
                                                                                    .sum = a.Sum(Function(p) p.SUELDO)}).ToList

Caso 2: Agrupación por varios campos + operador adicional
en el siguiente ejemplo se obtiene la suma de "Sueldos" por año y número.

Dim p2 = lista.GroupBy(Function(g) New With {Key g.ANIO, Key g.NUMERO}). _
                        Select(Function(a) New With {.anio = a.Key.ANIO,
                                                     .num = a.Key.NUMERO,
                                                     .sum = a.ToList.Sum(Function(p) p.SUELDO)}).ToList

Caso 3: Uso de GroupBy como reemplazo del Distinct
el siguiente ejemplo aplica el distinct sobre el campo: "ANIO":

Dim p3 = lista.GroupBy(Function(g) g.ANIO).Select(Function(a) a.First).ToList

en caso se tenga se tenga que aplicar varios campos se utilizará lo siguiente:

Dim p4 = lista.GroupBy(Function(g) g.ANIO And g.NUMERO).Select(Function(a) a.First).ToList

Saludos