none
Unir el resultado de varias consultas para datagridview RRS feed

  • Pregunta

  • Buenos días.

    1. Tengo una tabla con los campos fecha, idmedida, valor (aproximadamente, para simplficar)

    2. Tengo que consultar, para un rango de fechas, una serie de "medidas" y volcar el total a un datagridview, haciendo un pivot para que las medidas sean columnas, de manera que me queden las columnas fecha, idmedida1, idmedida2...

    3. Estoy intentando hacerlo con LINQ pero no hay manera, recupero cada medida para hacer un full outer join, como directamente no se puede intenté hacer un left outer join, un rigth outer join y luego una union.

    4. Con dos medidas me funciona correctamente, pero con 3 ya no... Error de la clase "Tipo Anonimo no se puede convertir en Tipo Anonimo" 

    Tipo anonimo no se puede convertir en tipo anonimo...

    Alguna idea?

    Dim datos0 = From datMed0 In db.Datos10minutales

                       Where datMed0.LnMedida = CType(aEstacionesIdMedidas(0), Integer) _
                       AndAlso datMed0.InstanteLectura > Henreda.FechaInicio _
                       AndAlso datMed0.InstanteLectura <= Henreda.FechaFin
                       Select New With {datMed0.InstanteLectura, datMed0.Valor, datMed0.LnCodigoValidacion, datMed0.LnNivelValidacion, datMed0.Visual}
                    Dim datos1 = From datMed1 In db.Datos10minutales
                       Where datMed1.LnMedida = CType(aEstacionesIdMedidas(1), Integer) _
                       AndAlso datMed1.InstanteLectura > Henreda.FechaInicio _
                       AndAlso datMed1.InstanteLectura <= Henreda.FechaFin
                       Select New With {datMed1.InstanteLectura, datMed1.Valor, datMed1.LnCodigoValidacion, datMed1.LnNivelValidacion, datMed1.Visual}
                    Dim datos2 = From datMed2 In db.Datos10minutales
                       Where datMed2.LnMedida = CType(aEstacionesIdMedidas(2), Integer) _
                       AndAlso datMed2.InstanteLectura > Henreda.FechaInicio _
                       AndAlso datMed2.InstanteLectura <= Henreda.FechaFin
                       Select New With {datMed2.InstanteLectura, datMed2.Valor, datMed2.LnCodigoValidacion, datMed2.LnNivelValidacion, datMed2.Visual}


                    If datos0.Count > 0 Or datos1.Count > 0 Or datos2.Count > 0 Then
                        Dim LeftOuterJoin = (From d0 In datos0
                                            Group Join d1 In datos1
                                            On d0.InstanteLectura Equals d1.InstanteLectura Into Group
                                            From d1 In Group.DefaultIfEmpty
                                            Select New With {.InstanteLectura = d0.InstanteLectura, _
                                                            .va0 = d0.Valor, .cv0 = d0.LnCodigoValidacion, .nv0 = d0.LnNivelValidacion, .vi0 = d0.Visual, _
                                                            .va1 = d1.Valor, .cv1 = d1.LnCodigoValidacion, .nv1 = d1.LnNivelValidacion, .vi1 = d1.Visual}).ToList

                        Dim RightOuterJoin = (From d1 In datos1
                                             Group Join d0 In datos0
                                             On d1.InstanteLectura Equals d0.InstanteLectura Into Group
                                             From d0 In Group.DefaultIfEmpty
                                             Select New With {.InstanteLectura = d0.InstanteLectura, _
                                                            .va0 = d0.Valor, .cv0 = d0.LnCodigoValidacion, .nv0 = d0.LnNivelValidacion, .vi0 = d0.Visual, _
                                                            .va1 = d1.Valor, .cv1 = d1.LnCodigoValidacion, .nv1 = d1.LnNivelValidacion, .vi1 = d1.Visual}).ToList


                        Dim nuevoDatos0 = LeftOuterJoin.Union(RightOuterJoin)

                        LeftOuterJoin = (From d0 In nuevoDatos0
                                        Group Join d2 In datos2
                                        On d0.InstanteLectura Equals d2.InstanteLectura Into Group
                                        From d2 In Group.DefaultIfEmpty
                                        Select New With {.InstanteLectura = d0.InstanteLectura, _
                                                            .va0 = d0.va0, .cv0 = d0.cv0, .nv0 = d0.nv0, .vi0 = d0.vi0, _
                                                            .va1 = d0.va1, .cv1 = d0.cv1, .nv1 = d0.nv1, .vi1 = d0.vi1, _
                                                            .va2 = d2.Valor, .cv2 = d2.LnCodigoValidacion, .nv2 = d2.LnNivelValidacion, .vi2 = d2.Visual}).ToList

    En este nuevo leftouterjoin me da el error...


    jueves, 15 de mayo de 2014 13:15

Todas las respuestas

  • hola

    si las listas tienen la misma estructura podrias usar el union()

    How to: Return the Set Union of Two Sequences (LINQ to SQL)

    lo que si deberias evaluar si te deja hacelro con entidades anonimas, quizas debas crear una clase con propiedades para crear en cada query y despues unirlas

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 15 de mayo de 2014 15:07
  • Hola Leandro. Gracias por responder, y aprovecho para felicitarte por tu blog, que tengo revisado en varias ocasiones.

    Te explico un poco mejor el tema, yo tengo una tabla donde se almacenan datos, cada dato tiene (entro otras cosas, por simplificar) fecha, idmedida, valor. (las fechas actuarán de clave para las relaciones, no hay dos fecha/medida iguales)

    Necesito sacar a un grid un intervalo de fechas y idmedidas, el usuario selecciona un intervalo de fechas y una serie de medidas, de 1 a 6 medidas máximo. 

    De entrada hice las consultas linq para cada posible conjunto de datos y luego les hacia un inner join, el problema es que alguna de las series de datos de una medida puede no estar completa, por eso necesitaría un full outer join, que me rellene los huecos con nulls. Buscando documentación veo que el equivalente TSQL del full outer join no está soportado por linq, y que los "remedios" suelen ser hacer left outer join, right outer join y unir.

    Si tengo solo dos series de datos no hay problema, ya que tengo el mismo número de elementos a cada lado, inculso si fuesen 4 me imagino que podría hacerlo en dos pasos, pero al ser 3 o 5 o 6 no me deja hacer el union, ya que no tengo el mismo nº de elementos en cada lado...

    Para tres series haría la primera union, pero al querer unir con el segundo

    en el izquierdo tendría fecha1,datos1,datos2 y el la derecha fecha3,datos3, creo que por eso me da el error...

    Pero no se como podría solucionarlo. Atentamente Jesús Calviño
    lunes, 19 de mayo de 2014 8:22