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

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:
- Ubicación – la ubicación en cuestión
- 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.