[LINQ] Maestro – Detalle en un mismo Registro (1)

Problema

Lo primero, voy a exponer el problema que me han planteado:

Dada una tabla, digamos, “Cabecera”, con una tabla relacionada de “Detalle” con una relación 1 a N. Necesitamos mostrar todos los datos del detalle, asociados a una fila de la cabecera sin repetir los datos de la cabecera.

Digamos que la representación Sería algo así:

Cabecera
C1 C2 C3
1 P1 01/01/2011
2 P2 01/02/2011
Detalle
1 1 D1
2 1 D2
3 1 D3
4 2 D1
5 2 D4

 

RESULTADO A OBTENER
1 P1 01/01/2011 D1, D2, D3
2 P2 01/02/2011 D1,D4

 

Enfoques

Así a bote pronto, se me ocurren 3 posibles enfoques:

  1. Hacerlo desde la BD.
  2. Hacerlo desde Código .NET con bucles…
  3. Hacerlo con LINQ

¿Hacerlo desde la BD?

La primera opción que se me ha ocurrido (por eso de que me gustan bastante las BD), ha sido: Esto se podría resolver creando un SP, Función y a través de un cursor devolver el dato separado por el carácter indicado.

Es una opción que he descartado porque no siempre tenemos la opción de modificar la BD a nuestro gusto.

¿Hacerlo desde Código .NET?

La siguiente alternativa sería, obtener los datos desde la BD con una consulta “JOIN” entre las tablas de Cabecera y Detalle, recorrer las filas, y generar un “nuevo DataTable”…

Descartada….

¿Hacerlo con  LINQ?

La opción de LINQ, nos va a permitir que no solamente lo podamos hacer contra la BD (ya sea con EF o con LINQTOSQL), sino también contra Objetos o XML…

Para demostrarlo voy a mostrar un pequeño Ejemplo con una Clase y Listas.

EJEMPLO

Dada una clase Empleado:

   1: public class Empleado

   2: {

   3:     public Empleado() { }

   4:     public Int32 ID { get; set; }

   5:     public String Nombre { get; set; }

   6:     public String Apellido { get; set; }

   7:     public List<string> Numeros { get; set; }

   8: }

La clase Empleado se va a corresponder con la tabla “Cabecera” y la lista Números  se va a corresponder con la tabla “Detalles”.

A continuación, para obtener el resultado indicado arriba, voy a realizarlo a través de una consulta LINQ:

   1: List<Empleado> listado = new List<Empleado>();

   2: //Rellenar Listado

   3: var consulta = from Empleado em in listado

   4:     let Numeros = string.Join(";", em.Numeros)

   5:     select new { 

   6:     em.Nombre,

   7:     Numeros

   8:     };

En la consulta estoy empleado el Operador LET, el cual va a permitir “almacenar” una expresión, en este caso el resultado de la función Join de la clase String, la cual se encarga de unir, un conjunto de datos, separándolos por el carácter indicado.

Os dejo el enlace al proyecto de ejemplo que he utilizado para que lo comprobéis con vuestros ojos. 😀

 

Saludos

Un comentario en “[LINQ] Maestro – Detalle en un mismo Registro (1)”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *