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

Ayer os hablaba de la necesidad de mostrar en una misma línea los datos de Cabecera y Detalle asociados.

Para solventarlo estuve probando con una clase y con una consulta de LINQ, ya que no podía probarlo el proyecto de EF donde quería aplicarlo.

Cuando me disponía a implementarlo en el proyecto bueno, me encontré con el siguiente mensaje de error:

LINQ to Entities no reconoce el método ‘System.String Join(System.String, System.Collections.Generic.IEnumerable`1[System.String])’ del método, y este método no se puede traducir en una expresión de almacén.

La consulta que ha provocado este error ha sido:

   1: var consulta = (from TCabecera cab in 

   2:                  contexto_local.TCabecera  

   3:    let Detalle = (from TDetalle detalle 

   4:                    in cab.TDetalle 

   5:    select detalle.Nombre)    

   6:    let Nombres = string.Join(",",Detalle )     

   7:    select new   

   8:       {  

   9:        cab.Campo1, 

  10:        cab.Campo2, 

  11:        Nombres

  12:        }).ToList();

  13: grid.DataSource=consulta;

 

¿Por qué se produce este error?

El error se produce al intentar asignar a Nombres la unión de Detalle. Este se debe a que no se puede convertir en un primer momento, la consulta a TSQL.

¿Cómo Solucionarlo?

Para poder solucionarlo vamos a necesitar ejecutar la consulta en 2 pasos:

   1: var consulta = (from TCabecera cab in   

   2:                 contexto_local.TCabecera    

   3:       let Detalle = (from TDetalle detalle   

   4:                      in cab.TDetalle   

   5:                      select detalle.Nombre)      

   6:      select new     

   7:       {    

   8:         cab.Campo1, 

   9:         cab.Campo2,  

  10:         Detalle 

  11:         }).ToList();  

  12: var consulta2 = (from dato in consulta

  13:             let Nombes = string.Join(",",dato.Detalle)

  14:             select new 

  15:             {

  16:             dato.Campo1,

  17:             dato.Campo2,

  18:             Nombres

  19:             };

  20:         grid.DataSource=consulta2.ToList();

CURIOSIDAD

Esto me ha sucedido al hacer la consulta contra Entidades de EF (LINQ-To-Entities). Decidí probarlo contra LINQ-to-SQL y cual fue mi sorpresa:

Funcionó en un único Paso!

Saludos, y espero que os sea de utilidad.

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

Deja un comentario

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