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.