none
Ayuda para convertir conslta sql a Linq RRS feed

  • Pregunta

  • Amigos tengo un sistema en el que tengo que migrar un archivo excel, hasta aqui no hay problema, de ahi tengo que hacer una relacion con una tabla de mi sistema en la que los unicos campos posibles de identificar o de relacionar es el RFC, por lo que solicito apoyo para poder convertir la siguiente consulta a linq.

    SELECT      C.RfcProveedor, A.ClaveCucop, A.Gpo, A.Gen, A.Esp, A.Dif, A.[Var], A.Descripcion, A.Uni, A.Cant,
    			A.Tipo, B.NoContrato, B.CantMax, B.CantMin, B.PrecioNeto, B.PorcentajeAsignado, C.MontoContrato, C.MontoMinimo, 
                C.NoLicitacionSai, C.NoLicitacion, D.RazonSocial, YEAR(C.FechaTerminacion) AS Anio
    FROM        MtoCatArticulo AS A
    			LEFT OUTER JOIN DetalleContrato AS B ON A.Gpo = B.Gpo AND A.Gen = B.Gen AND A.Esp = B.Esp AND A.Dif = B.Dif AND A.[Var] = B.[Var]
    			LEFT OUTER JOIN MtoContrato AS C ON B.NoContrato = C.NoContrato
    			LEFT OUTER JOIN
                MtoProveedor AS D ON C.RfcProveedor = D.RfcProveedor

    estoy intentado con el siguiente código en linqpad

    var JoinResult = (
    from MtoArt in MtoCatArticulo
    join DetCont in DetalleContrato on new {MtoArt.Gpo,MtoArt.Gen,MtoArt.Esp,MtoArt.Dif,MtoArt.Var} equals new {DetCont.Gpo,DetCont.Gen,DetCont.Esp,DetCont.Dif,DetCont.Var}  into CatDet
    from CD in CatDet.DefaultIfEmpty() // LEFT JOIN
    join MtoCont in  MtoContrato on  CD.NoContrato equals MtoCont.NoContrato into group1
    from g1 in group1.DefaultIfEmpty()
    join MtoProv in MtoProveedor on g1.RfcProveedor equals MtoProv.RfcProveedor into group2
    from g2 in group2.DefaultIfEmpty()
    select new {
    MtoArt.Gpo, 
    MtoArt.Gen,
    MtoArt.Esp,
    MtoArt.Descripcion,
    MtoArt.Uni,
    MtoArt.Cant,
    MtoArt.Tipo,
    g1.NoContrato,
    CD.CantMax,
    CD.CantMin,
    CD.PrecioNeto,
    CD.PorcentajeAsignado,
    g1.NoLicitacionSai,
    g1.NoLicitacion,
    });
    
    JoinResult.Dump();

    sin embargo pareciera que me esta regresando unicamente los registro como si fuera un inner join , y no un inner left que es lo que necesito.

    de antemano muchas gracias.


    Horacio Xochitemol Bautista

    martes, 14 de abril de 2020 3:00

Todas las respuestas

  • hola

    Lo que no entiendo es porque la tabla A y B se une por tantos campos, cuantas keys tienen las tablas?

    Estas seguro que la query tiene que comenzar por el CatArticulo y no por el Contrato? creo que ya el sql arranca incorrecto

    Que es lo que realmente estas consultando las categorias o el contrato?

    Cuando armas el linq con un left join lo que te permite es recuperar todas las categorias, y despues validar si hay relacion con detalles, contratos, proveedores para ver si hay o no relacion entre estos y poner el dato en el select o dejarlo en null a esa propiedad, pero es solo eso

    Si arrancas el linq con la tabla principal definida de forma incorrecta el linq no dara el resultado valido

    Creo que estas equivocando al definir cual es la tabla principal, que deberia ser el Contrato y en base a esta ver las relaciones con el resto

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 14 de abril de 2020 11:50
  • que tal Leandro buenas noches.

    te comento tabla catalogo tiene una lista de artículos (ejemplo 100), y lo que quieren que es dependiendo del articulo que se busque me muestre los contratos por año y a que precios se han comprado, así como los contratos y los proveedores, te muestro imagen

    Lo que no entiendo es porque la tabla A y B se une por tantos campos, cuantas keys tienen las tablas?,

    ese es el punto la tabla no tienes keys, entonces los únicos datos por lo que los puedo vincular son esos campos.

    Creo que estas equivocando al definir cual es la tabla principal, que debería ser el Contrato y en base a esta ver las relaciones con el resto

    para este punto te comento que la tabla inicial debe ser el catalogo, porque se debe consultar una articulo y en caso de no tener contrato entonces debe mostrar información de la tabla catálogos y realizar otra consulta.

    Gracias por el apoyo saludos.


    Horacio Xochitemol Bautista

    miércoles, 15 de abril de 2020 3:23
  • hola

    >>la tabla no tienes keys, entonces los únicos datos por lo que los puedo vincular son esos campos.

    estas usando Entity Framework ? si es asi como hiciste para mapear una entidad sin key? porque hasta donde conozco eso no se puede realizar

    >>en caso de no tener contrato entonces debe mostrar información de la tabla catálogos y realizar otra consulta.

    no entendi

    Quizas no puedas armar un linq, por ahi debas tomar el sql y definir un view para luego mapear esta a una entiedad directamente y que la ejecucion de cona consulta se realice en la db

    Igualmente no creo que estes entendiendo como aplica el left join de linq, porque cuando armas el select usas g1.NoContrato y eso no es correcto, el g1 lo usas para evaluar si hay o no datos en la relacion, pero despues tienes que usar group1 y esta no es un solo item sino que se trata de una lista de contratos para ese catalogo

    Si pones g1 solo estas tomando un valor o en su defecto null sino hay items en la relacion, si pones group1 tendras a lista de contratos para el catalogo, es una relacion uno a muchos, se arma una jerarquia, pero no se aplanan los datos como en sql que te repite el dato en las columnas del catalogo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 15 de abril de 2020 13:30