Tipos anónimos en LINQ para reportes complejos
Clase 28 de 35 • Curso de C# con .Net Core 2.1
Contenido del curso
Etapa 5 – POO reutilicemos nuestro código
- 2

Herencia para reutilizar código C#
10:30 min - 3

Herencia y Polimorfismo en Programación Orientada a Objetos
11:42 min - 4

Polimorfismo en Programación Orientada a Objetos
13:17 min - 5

Casting en C#: cuándo funciona y cuándo falla
07:09 min - 6

Conversiones seguras en C# con is y as
12:44 min - 7

Sobrescribir ToString para depuración en C#
08:15 min
Etapa 6- Ajustes y funcionalidad
Etapa 7 – Preparando información para nuestros reportes
- 11

Manejo Avanzado de Métodos y Parámetros en Programación
15:43 min - 12

Manejo de Parámetros de Salida en Visual Studio Code
04:38 min - 13

Sobrecarga de Métodos para Parámetros de Salida Opcionales
05:51 min - 14

Optimización de Listas: Buenas Prácticas en C#
04:16 min - 15

Dictionary: cómo funciona en C#
11:14 min - 16

Diccionarios con polimorfismo en C#
10:48 min - 17

Uso de Constantes y Enumeraciones para Optimizar Diccionarios en C#
11:33 min - 18

Foreach anidado para diccionarios en C#
13:47 min - 19

Depuración de diccionarios en C#
09:37 min - 20

Parámetro opcional para controlar impresión en C#
11:47 min - 21

Cómo usar switch en lugar de if/else
14:30 min - 22

Números aleatorios y eventos en C#
12:52 min - 23

Diccionarios y Refactoring en Programación Básica
02:13 min
Etapa 8 – Consultas
- 24

Cómo crear un reporteador en C sharp
11:42 min - 25

Generación segura de reportes en sistemas de información
10:21 min - 26

Construcción de reportes con LINQ en C#
11:48 min - 27

Diccionario con evaluaciones por asignatura
08:32 min - 28

Tipos anónimos en LINQ para reportes complejos
Viendo ahora - 29

Cálculo del Promedio de Notas Agrupadas por Alumno y Asignatura
10:46 min - 30

Creación de Tipos de Datos Personalizados en Programación Avanzada
12:05 min - 31

Generación de Reportes con LINQ en C#
02:09 min
Etapa 9 – Creando una UI de Consola
Crear reportes potentes en C Sharp con LINQ es más simple cuando se aplica una regla clave: divide y vencerás. Aquí se diseña un reporte que agrupa por asignatura y devuelve el promedio de cada alumno en esa asignatura, reutilizando piezas previas, como el diccionario de evaluaciones por asignatura, y aprovechando tipos anónimos, IEnumerable y KeyValuePair en Visual Studio. Además, se refuerza cómo el razonamiento de SQL se traslada de forma natural a LINQ, incluso si apenas tienes proficiency inicial.
¿Cómo estructurar el reporte con LINQ y Visual Studio?
El objetivo es regresar un diccionario donde la clave sea la asignatura y el valor una colección con datos del alumno y su promedio. Para llegar ahí, primero se define la forma del retorno y se prepara el espacio para construir la respuesta.
- Clave del diccionario: nombre de la asignatura.
- Valor: colección con datos del alumno y su nota promedio.
- Requisito: consultar evaluaciones por asignatura y promediar por alumno.
- Estrategia: extraer piezas en métodos pequeños y reutilizables.
- Visibilidad: métodos públicos si exponen funcionalidad general; privados si resuelven un caso interno.
Código base del método y respuesta inicial:
// Firma y respuesta inicial
Dictionary<string, IEnumerable<object>> GetPromedioDeAlumnosPorAsignatura()
{
var rta = new Dictionary<string, IEnumerable<object>>();
// Construcción de rta ocurre después de consultar y proyectar datos
return rta;
}
¿Qué retorna el diccionario y por qué usar IEnumerable
Al comienzo no existe un tipo concreto que combine “alumno” con “nota”. Por eso, se usa IEnumerable como marcador temporal. Más adelante, con tipos anónimos, se proyectan los campos necesarios sin definir una clase explícita. Así, se avanza sin bloquearse por el modelo de datos definitivo.
- Tipo anónimo: permite devolver un “objeto compuesto” sin crear una clase.
- Flexibilidad: se incluyen campos del alumno y la nota de la evaluación.
- Iteración: el resultado es una colección; se recorre con
foreach.
¿Cómo iterar el diccionario de evaluaciones por asignatura?
Se reutiliza el diccionario de evaluaciones por asignatura del reporte previo. Cada entrada es un KeyValuePairKey es la asignatura y Value la lista de evaluaciones. Se proyecta lo necesario con LINQ y se usa un tipo anónimo para devolver múltiples campos en una sola selección.
KeyValuePair: entrada con clave (string) y valor (lista de evaluaciones).foreach: recorre cada asignatura y sus evaluaciones asociadas.Select: proyecta los campos requeridos en un tipo anónimo.- Nota práctica: no se pueden devolver “dos cosas” sin un objeto compuesto.
Ejemplo de proyección y recorrido del resultado:
foreach (var asignaturaConEvaluaciones in dictEvalPorAsignatura)
{
var dummy = asignaturaConEvaluaciones.Value.Select(ev => new
{
UniqueId = ev.Alumno.UniqueId, // *unique ID* del alumno
Nota = ev.Nota, // nota de la evaluación
AlumnoNombre = ev.Alumno.Nombre,
NombreEvaluacion = ev.Nombre
});
foreach (var item in dummy)
{
var id = item.UniqueId;
var nota = item.Nota;
// usar propiedades proyectadas sin conflictos
}
}
- Importante: el resultado de la proyección es una colección; por eso se itera. En consultas con
into, el resultado también se trata como lista, incluso con un solo elemento.
¿Cómo evitar conflictos de nombres en tipos anónimos?
Si proyectas dos propiedades con el mismo nombre (por ejemplo, Nombre del alumno y Nombre de la evaluación), se produce un conflicto. La solución es renombrar las propiedades en la proyección.
- Uso recomendado:
AlumnoNombreyNombreEvaluacion. - Beneficio: lectura clara y sin errores del compilador.
- Resultado: acceso simple a
item.AlumnoNombreyitem.NombreEvaluacion.
¿Cómo calcular el promedio por alumno en cada asignatura?
La meta es que cada asignatura muestre, para cada alumno, el promedio de sus evaluaciones. Un alumno puede tener varias evaluaciones en la misma asignatura; por eso, el paso clave es consolidar esas notas antes de formar la respuesta final.
- Enfoque: pensar en agrupar las evaluaciones por unique ID del alumno dentro de cada asignatura.
- Cálculo: obtener la media de
Notapara ese alumno y asignatura. - Resultado esperado: por asignatura, una colección con alumno y su promedio.
- Nota: la solución completa del cálculo se desarrolla a continuación del diseño mostrado.
Habilidades y conceptos reforzados:
- Divide y vencerás: descomponer problemas complejos en métodos pequeños y reutilizables.
- LINQ vs SQL: lógica de consulta similar; el cambio es de sintaxis, no de razonamiento.
- Diccionarios: clave string (asignatura) y valor colecciones de evaluaciones.
- Tipos anónimos: devolver múltiples campos sin crear clases explícitas.
- IEnumerable: trabajar con secuencias y diferir la ejecución.
- KeyValuePair: modelo de entrada al recorrer diccionarios.
- foreach: recorrer colecciones proyectadas por LINQ.
- Diseño de métodos: públicos para funcionalidades generales; privados para utilidades internas.
¿Tienes dudas sobre la proyección con tipos anónimos o cómo estructurar el diccionario por asignatura? Comparte tu comentario y cuéntame cómo lo estás resolviendo.