none
convertir esta query linq en Lambda RRS feed

  • Pregunta

  • Hola como va ?. Tengo una query linq 

     var lstPacSes = from sp in db.SesionesPacientes
                                join pra in db.Practicas on sp.PracticaId equals pra.CodigoId
                                join ob in db.ObraSociales on sp.ObraSocialId equals ob.CodigoId
                                where sp.PacienteId == _Paciente && sp.PracticaId == npra && sp.EstaEliminado == false
    
                                group sp by
                                new
                                {
                                    sp.CodigoId,
                                    sp.PacienteId,
                                    ob.NombreObraSocial,
                                    pra.NombrePractica,
                                    sp.SesionesRegistro,
                                    sp.FechaRegistro,
                                    sp.SesionesUsadas,
                                    sp.SesionesRestantes,
                                    sp.FechaUsoMaxima,
                                    sp.Observaciones
                                } into grp
                                select new
                                {
                                    Cod = grp.Key.CodigoId,
                                    Paciente = grp.Key.PacienteId,
                                    ObraSocial = grp.Key.NombreObraSocial,
                                    Practica = grp.Key.NombrePractica,
                                    Registradas = grp.Key.SesionesRegistro,
                                    FechaRegistro = grp.Key.FechaRegistro,
                                    Usadas = grp.Key.SesionesUsadas,
                                    Restantes = grp.Key.SesionesRestantes,
                                    FechaTope = grp.Key.FechaUsoMaxima,
                                    Observaciones = grp.Key.Observaciones
                                };
    Lo que necesitó hacer ahora es pasar esta misma consulta a lambda. Desde ya gracias

    domingo, 30 de mayo de 2021 12:52

Respuestas

  • ¿Cuál es la signatura de los extensores de System.Linq.Dynamic? Si están pensados para extender IQueryable<T>, debería ser factible aplicarlos sobre la consulta linq encerrada entre paréntesis. Es decir, algo así como esto:

    var q = (from algo in loquesea ... select datos).Where("condicion dinamica");

    Si el compilador se hace un lío entre el Where de System.Linq y el de System.Linq.Dynamic, siempre puedes usar la llamada convencional en lugar de usarlo como un extensor, y meter el namespace completo en la llamada. Es decir, algo parecido a esto:

    var q1 = from algo in loquesea ... select datos;

    var q2 = System.Linq.Dynamic.Where(q1, "condicion dinamica");

    • Propuesto como respuesta EricRRModerator lunes, 31 de mayo de 2021 22:27
    • Marcado como respuesta EnzoTuc40 viernes, 11 de junio de 2021 11:46
    domingo, 30 de mayo de 2021 19:05
    Moderador
  • Este es el tipo de operaciones en linq donde la sintaxis tipo query es mas fácil de escribir ya que el metodo Join es poco intuitivo.  Igual tu consulta sería similar a esta (agrega el resto de tus campos en el GroupBy y el Select):

    var lstPacSes = SesionesPacientes.Join(Practicas, sp=>sp.PracticaId, pra=>pra.CodigoId, (sp, pra)=>new {sp, pra})
    .Join(ObraSociales, sppra => sppra.sp.ObraSocialId, ob=>ob.CodigoId,(sppra,ob) => new {sppra, ob})
    .Where(j=> j.sppra.sp.PacienteId == _Paciente && j.sppra.sp.PracticaId == npra && j.sppra.sp.EstaEliminado == false)
    .GroupBy(j=>new {j.sppra.sp.CodigoId, j.sppra.sp.PacienteId, j.ob.NombreObraSocial, j.sppra.pra.NombrePractica})
    .Select(g=> new {g.Key.CodigoId, g.Key.PacienteId, g.Key.NombreObraSocial, g.Key.NombrePractica});

    Saludos

    • Propuesto como respuesta EricRRModerator lunes, 31 de mayo de 2021 22:27
    • Marcado como respuesta EnzoTuc40 viernes, 11 de junio de 2021 11:46
    lunes, 31 de mayo de 2021 13:26

Todas las respuestas

  • Lo que necesitó hacer ahora es pasar esta misma consulta a lambda.

    La pregunta sería por qué lo necesitas.

    En ambos casos (la lambda o la expresión Linq) lo que va a hacer el compilador es convertirlas en una serie de llamadas a los extensores Linq, y las dos secuencias de llamadas van a ser equivalentes. Así que el resultado en general será el mismo en ambos casos. Pero la diferencia es que escribir ese mismo resultado usando expresiones lambda va a ser muchísimo más complicado y difícil de escribir. Y eso nos lleva a la pregunta de por qué quieres escribirlo de esta manera en lugar de escribirlo de la manera más simple. Tal vez si nos muestras el caso de uso, explicando qué es lo que pretendes hacer para que solo se pueda hacer con la Lambda, a lo mejor se nos ocurre alguna alternativa para lograr el mismo efecto sin tener que sustituir la consulta linq.

    domingo, 30 de mayo de 2021 13:05
    Moderador
  • Lo que necesitó hacer ahora es pasar esta misma consulta a lambda.

    La pregunta sería por qué lo necesitas.

    En ambos casos (la lambda o la expresión Linq) lo que va a hacer el compilador es convertirlas en una serie de llamadas a los extensores Linq, y las dos secuencias de llamadas van a ser equivalentes. Así que el resultado en general será el mismo en ambos casos. Pero la diferencia es que escribir ese mismo resultado usando expresiones lambda va a ser muchísimo más complicado y difícil de escribir. Y eso nos lleva a la pregunta de por qué quieres escribirlo de esta manera en lugar de escribirlo de la manera más simple. Tal vez si nos muestras el caso de uso, explicando qué es lo que pretendes hacer para que solo se pueda hacer con la Lambda, a lo mejor se nos ocurre alguna alternativa para lograr el mismo efecto sin tener que sustituir la consulta linq.

    Hola Alberto gracias por responder. Lo que necesito hacer y no se como hacerlo es a esa consulta le voy a agregar "System.Linq.Dinamic.Core" puesto que aunque no aparece en la consulta que envié tengo varios combos que van a resultar en los filtros, ya que evaluando resultaría mas practico hacerlo así que hacer múltiples if, porque además a esos combos le agregue ítems llamados "TODOS" por lo que la consulta final me quedaría igual a el filtro o distinto del filtro. Y los ejemplos que tengo están hechos en lambda. De todas formas cualquier sugerencia es aceptada, solo lo hago así porque ya implemente antes esta solución, solo que usaba una sola tabla. Desde ya gracias
    domingo, 30 de mayo de 2021 13:23
  • ¿Cuál es la signatura de los extensores de System.Linq.Dynamic? Si están pensados para extender IQueryable<T>, debería ser factible aplicarlos sobre la consulta linq encerrada entre paréntesis. Es decir, algo así como esto:

    var q = (from algo in loquesea ... select datos).Where("condicion dinamica");

    Si el compilador se hace un lío entre el Where de System.Linq y el de System.Linq.Dynamic, siempre puedes usar la llamada convencional en lugar de usarlo como un extensor, y meter el namespace completo en la llamada. Es decir, algo parecido a esto:

    var q1 = from algo in loquesea ... select datos;

    var q2 = System.Linq.Dynamic.Where(q1, "condicion dinamica");

    • Propuesto como respuesta EricRRModerator lunes, 31 de mayo de 2021 22:27
    • Marcado como respuesta EnzoTuc40 viernes, 11 de junio de 2021 11:46
    domingo, 30 de mayo de 2021 19:05
    Moderador
  • Este es el tipo de operaciones en linq donde la sintaxis tipo query es mas fácil de escribir ya que el metodo Join es poco intuitivo.  Igual tu consulta sería similar a esta (agrega el resto de tus campos en el GroupBy y el Select):

    var lstPacSes = SesionesPacientes.Join(Practicas, sp=>sp.PracticaId, pra=>pra.CodigoId, (sp, pra)=>new {sp, pra})
    .Join(ObraSociales, sppra => sppra.sp.ObraSocialId, ob=>ob.CodigoId,(sppra,ob) => new {sppra, ob})
    .Where(j=> j.sppra.sp.PacienteId == _Paciente && j.sppra.sp.PracticaId == npra && j.sppra.sp.EstaEliminado == false)
    .GroupBy(j=>new {j.sppra.sp.CodigoId, j.sppra.sp.PacienteId, j.ob.NombreObraSocial, j.sppra.pra.NombrePractica})
    .Select(g=> new {g.Key.CodigoId, g.Key.PacienteId, g.Key.NombreObraSocial, g.Key.NombrePractica});

    Saludos

    • Propuesto como respuesta EricRRModerator lunes, 31 de mayo de 2021 22:27
    • Marcado como respuesta EnzoTuc40 viernes, 11 de junio de 2021 11:46
    lunes, 31 de mayo de 2021 13:26
  • Hola Enzo,

    ¿Alguna novedad sobre la consulta realizada?

    Gracias por usar los foros de MSDN.

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.

    lunes, 31 de mayo de 2021 14:06
    Moderador
  • Hola Perdón por la demora, tuve problemas con la computadora y recién estoy rearmando todo, agradezco la soluciones propuestas y aunque todavía no pude probarla, voy a dar como respondida ya que siempre los usuarios que respondieron, lo hacen de forma correcta. De nuevo gracias
    viernes, 11 de junio de 2021 11:46