Saltar al contenido

Agrupación y agregación de datos con LINQ

Se nos ha encargado organizar los datos de los empleados de la Selección y Transformación de Datos con LINQ, un conjunto de empleados, por ubicación del empleado. En nuestros datos de empleado, cada objeto de empleado tiene un código de grupo que se ve así:

AA123

Agrupación y agregación de datos con LINQ
Agrupación y agregación de datos con LINQ

En este código, las dos primeras letras indican un código de localización, seguido de tres números que indican el número de la oficina. El primer paso para crear cualquier consulta es refinar los campos que queremos devolver – si la calidad de nuestra pregunta es pobre, es poco probable que terminemos con una respuesta de alta calidad. Los campos que queremos devolver son:

  1. Ubicación – la ubicación en cuestión
  2. Total – el número total de empleados por ubicación

Cada resultado tendrá un total de int, un número y una cadena de localización, el código de dos letras que representa dónde están los empleados. Para que esto suceda, vamos a devolver un tipo anónimo. Los tipos anónimos nos permiten devolver un tipo que definimos en el momento de la consulta y que es generado por el compilador.

Una consulta LINQ fluida que devuelve TODO se ve así:

1de e en empleados seleccione empleado

csharp

Para devolver nuestro tipo anónimo, modificaremos la consulta para que se vea así:

1de e en los empleados seleccionados nuevos{Ubicación, Total};

csharp

El compilador nos da dos errores con esto:

123_El nombre "Ubicación" no existe en el contexto actual__El nombre "Total" no existe en el contexto actual_

Esto tiene sentido, no hemos definido esos elementos todavía. Para que esto funcione, necesitamos agrupar el contenido. Para ello, utilizamos la sentencia group by :

123desde e en el grupo de empleados e por e.GroupCode.ToUpper().Substring(0,2)into gselectnew{ Ubicación, Total };

csharp

Aquí, estamos tomando los dos primeros caracteres de la propiedad GroupCode del objeto Employee y agrupando el conjunto por ese valor en un conjunto de grupo que hemos designado como g .** Pero todavía tenemos nuestros mismos dos errores de compilación – el sistema no sabe todavía lo que significan Location o Total.

En este punto, el contenido de g se ve así:

AA (Lista de objetos de empleados con código de grupo que comienza con AA)

ZZ (Objeto de empleado con código de grupo que comienza con ZZ)

El AA y ZZ son claramente los valores del campo Location que hemos creado .

1e.GroupCode.ToUpper().Substring(0,2)

csharp

Las listas contienen los empleados asociados a cada ubicación. La clave que creamos para la agrupación, en este caso los dos primeros caracteres del código de grupo, está disponible en una propiedad Key en el objeto g:

123var groups =desde e en employeesgroup e por e.GroupCode.ToUpper().Substring(0,2)into gselectnew{ Location = g.Key, Total };

csharp

Un error de compilación desaparece ahora que hemos definido de dónde viene la ubicación. A continuación, definiremos Total como el recuento de objetos asociados a esa clave en el grupo g :

123desde e en el grupo de empleados e por e.GroupCode.ToUpper().Substring(0,2)into gselectnew{ Ubicación = g.Key, Total = g.Count()};

csharp

Count() aquí es un método, no una propiedad. Estamos pidiendo el tamaño de la lista de empleados y ese es nuestro total. Esto nos da el siguiente resultado:

AA 2

ZZ 1

Que es exactamente lo que queríamos.