none
Como obtener un LEFT JOIN en LINQ (con varios campos) RRS feed

  • Pregunta

  • Hola a todos, buen dia

    Tengo dos vars generados con querys linq previos.

    El var sdo contiene los saldos.

    El var rec contiene los pagos.

    Deseo obtener TODAS los registros de sdos, y en los que coincida con rec, que incorpore los pagos en EFECTIVO o en OTRAS_AP:

                var lgsdorec = from sdo in lqgsaldos
                               join rec in lqgrecup.DefaultIfEmpty() on new { sdo.IDDireccion, sdo.IDGerente, sdo.IDPromotor, sdo.TipoContrato, sdo.IDTipoCartera }
                                                    equals new { rec.IDDireccion, rec.IDGerente, rec.IDPromotor, rec.TipoContrato, rec.IDTipoCartera }
                               select new { sdo, 
                                            rec.EFECTIVO, 
                                            rec.OTRAS_AP,                   
                               };
    

    El query anterior, solo devuelve aquellos sdos que coinciden con rec....

    Ojala me puedan ayudar.

    Gracias!!!


    lunes, 29 de octubre de 2012 20:17

Respuestas

  • hola

    LEFT JOIN LINQ

    algo no me queda claro, porque usas tantos campos en el join, tan compleja es la entidad que no se puede relacionar por un id simple ?

     var lgsdorec = from sdo in lqgsaldos
    			   join rec in lqgrecup on new { sdo.IDDireccion, sdo.IDGerente, sdo.IDPromotor, sdo.TipoContrato, sdo.IDTipoCartera }
    									equals new { rec.IDDireccion, rec.IDGerente, rec.IDPromotor, rec.TipoContrato, rec.IDTipoCartera } into sdored
    				from temp in sdored.DefaultIfEmpty()
    			   select new 
    			   { 
    					saldo = sdo, 
    					efectivo = (temp == null) ? 0 : rec.EFECTIVO, 
    					otras = (temp == null) ? 0 : rec.OTRAS_AP                  
    			   };

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta arzamm martes, 30 de octubre de 2012 0:21
    • Desmarcado como respuesta arzamm martes, 30 de octubre de 2012 0:22
    • Marcado como respuesta arzamm martes, 30 de octubre de 2012 14:58
    lunes, 29 de octubre de 2012 23:20

Todas las respuestas

  • hola

    LEFT JOIN LINQ

    algo no me queda claro, porque usas tantos campos en el join, tan compleja es la entidad que no se puede relacionar por un id simple ?

     var lgsdorec = from sdo in lqgsaldos
    			   join rec in lqgrecup on new { sdo.IDDireccion, sdo.IDGerente, sdo.IDPromotor, sdo.TipoContrato, sdo.IDTipoCartera }
    									equals new { rec.IDDireccion, rec.IDGerente, rec.IDPromotor, rec.TipoContrato, rec.IDTipoCartera } into sdored
    				from temp in sdored.DefaultIfEmpty()
    			   select new 
    			   { 
    					saldo = sdo, 
    					efectivo = (temp == null) ? 0 : rec.EFECTIVO, 
    					otras = (temp == null) ? 0 : rec.OTRAS_AP                  
    			   };

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta arzamm martes, 30 de octubre de 2012 0:21
    • Desmarcado como respuesta arzamm martes, 30 de octubre de 2012 0:22
    • Marcado como respuesta arzamm martes, 30 de octubre de 2012 14:58
    lunes, 29 de octubre de 2012 23:20
  • Buenas tardes Leandro, gusto en saludarte

    Te comento que en este caso, las entidades sdo y rec son agrupamientos de datos 

    var lqgsaldos = from p in dsPMLG.SIAC_saldosNS group p by new { p.IDDireccion, p.IDGerente, p.IDCoordinador, p.IDPromotor, p.TipoContrato, p.IDTipoCartera } into g select new { IDDireccion = g.Key.IDDireccion, IDGerente = g.Key.IDGerente, IDCoordinador = g.Key.IDCoordinador, IDPromotor = g.Key.IDPromotor, TipoContrato = g.Key.TipoContrato, IDTipoCartera = g.Key.IDTipoCartera, // CAMPOS NORMALES usuario = g.Max(p => p.usuario), Fechaini = g.Max(p => p.Fechaini), Fechafin = g.Max(p => p.Fechafin), FREGISTRO = g.Max(p => p.Fechafin), DIRECCION = g.Max(p => p.DIRECCION), GERENTE = g.Max(p => p.GERENTE), CDGPE_RG = g.Max(p => p.CDGPE_RG), COORDINADOR = g.Max(p => p.COORDINADOR), CDGPE_CO = g.Max(p => p.CDGPE_CO), PROMOTOR = g.Max(p => p.PROMOTOR), CDGPE_AS = g.Max(p => p.CDGPE_AS), contrato = g.Max(p => p.contrato), TipoCartera = g.Max(p => p.TipoCartera), // CAMPOS NORMALES CDGRG = g.Max(p => p.CDGRG), GERENCIA = g.Max(p => p.GERENCIA), CDGCO = g.Max(p => p.CDGCO), COORDINACION = g.Max(p => p.COORDINACION), // CAMPOS AGRUPADOS NCREDCOL = g.Sum(p => p.NCREDCOL), SDOTOT = g.Sum(p => p.SDOTOT), VENTOT = g.Sum(p => p.VENTOT), PCMORA = g.Sum(p => p.SDOTOT) == 0 ? 0 : (g.Sum(p => p.VENTOT) / g.Sum(p => p.SDOTOT)) * 100 }; var lqgrecup = from p in dsPMLG.SIAC_APLIC_PAGOS group p by new { p.IDDireccion, p.IDGerente, p.IDCoordinador, p.IDPromotor, p.TipoContrato, p.IDTipoCartera } into g select new { IDDireccion = g.Key.IDDireccion, IDGerente = g.Key.IDGerente, IDCoordinador = g.Key.IDCoordinador, IDPromotor = g.Key.IDPromotor, TipoContrato = g.Key.TipoContrato, IDTipoCartera = g.Key.IDTipoCartera, // CAMPOS NORMALES //usuario = g.Max(p => p.usuario), Fechaini = g.Max(p => p.Fechaini), Fechafin = g.Max(p => p.Fechafin), FREGISTRO = g.Max(p => p.Fechafin), DIRECCION = g.Max(p => p.DIRECCION), GERENTE = g.Max(p => p.GERENTE), CDGPE_RG = g.Max(p => p.CDGPE_RG), COORDINADOR = g.Max(p => p.COORDINADOR), CDGPE_CO = g.Max(p => p.CDGPE_CO), PROMOTOR = g.Max(p => p.PROMOTOR), CDGPE_AS = g.Max(p => p.CDGPE_AS), contrato = g.Max(p => p.contrato), TipoCartera = g.Max(p => p.TipoCartera), // CAMPOS AGRUPADOS EFECTIVO = g.Sum(p => p.EFECTIVO), OTRAS_AP = g.Sum(p => p.OTRAS_AP) };

    Los pagos tienen que caer en el grupo que le corresponde:

                var lgsdorec = from sdo in lqgsaldos
                               join rec in lqgrecup.DefaultIfEmpty() on new { sdo.IDDireccion, sdo.IDGerente, sdo.IDPromotor, sdo.TipoContrato, sdo.IDTipoCartera }
                                                    equals new { rec.IDDireccion, rec.IDGerente, rec.IDPromotor, rec.TipoContrato, rec.IDTipoCartera }
                               select new { sdo, 
                                            rec.EFECTIVO, 
                                            rec.OTRAS_AP                      
                               };

    Por cierto, en la propuesta que señalas el compilador marca error con el sig. mensaje 

    Error 4 El nombre 'rec' no existe en el contexto actual  

    (subrayando de rojo donde esta  :rec.EFECTIVO Y rec.OTRAS_AP


    Gracias y que tengas un excelente dia!



    • Editado arzamm lunes, 29 de octubre de 2012 23:49
    lunes, 29 de octubre de 2012 23:30
  • pero te falta parte de la query de linq, donde esta

    from temp in sdored.DefaultIfEmpty()

    y donde esta el into del join


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    martes, 30 de octubre de 2012 2:08
  • tienes razon, el codigo que envie era el original, antes ver apicar la solucion que comentas. 

    El problema se corrigio asi cambiando "rec" por "temp"  asi:

     var lgsdorec = from sdo in lqgsaldos
    			   join rec in lqgrecup on new { sdo.IDDireccion, sdo.IDGerente, sdo.IDPromotor, sdo.TipoContrato, sdo.IDTipoCartera }
    									equals new { rec.IDDireccion, rec.IDGerente, rec.IDPromotor, rec.TipoContrato, rec.IDTipoCartera } into sdored
    				from temp in sdored.DefaultIfEmpty()
    			   select new 
    			   { 
    					saldo = sdo, 
    					efectivo = (temp == null) ? 0 : temp.EFECTIVO, 
    					otras = (temp == null) ? 0 : temp.OTRAS_AP                  
    			   };

    Muchas gracias!

    martes, 30 de octubre de 2012 14:59