none
Linq con condición RRS feed

  • Pregunta

  • Buenos días,

    Tengo una duda a la hora de realizar una petición a base de datos a través del driver ODAP Oracle manager data access 

    y Entityframework 6.0.0  además de  trabajar con linq.

    A la hora de realizar la la petición con linq:

                var query = from table in entidad.table
                            where IsSomething? table.field1== value1: table.field2 == value1 && table.filed3== value2 && table.filed3 < value3
                            select table;

    Como podéis ver al inicio del where en función the IsSomething que es un valor boolean cojo un campo de la tabla o otro y a continuación sigo incluyendo and.

    Bueno pues si pongo la query de esta forma me realiza correctamente la solicitud a la BBDD de Oracle. En el caso de poner la premisa: IsSomething? table.field1== value1: table.field2 == value1 al final de la select no tiene en cuenta el resto del where que este antes de la misma y me recupera solo los datos que concuerden con la esta premisa.

    Luego mi pregunta es simple porque ocurre esto con linq.

    Gracias a todos..

    viernes, 18 de enero de 2019 8:22

Respuestas

  • hola

    >>La pregunta es cuando pongo en el inicio de la query esta sentencia ISomething? table.filed1: table.Fiedl2 al inicio no da problemas funciona,

    no aconsejo uses esa forma de condicional

    >>me ha ocurrido con otra query donde pongo la siguiente expresión  lambda

    peor lo que planteas aqui es muy distinto a lo que planteaste en la consulta original, no defines ningun condicional al aplicar el filtro sobre un campo u otro

    >>en el caso de que veas linq en que en ocasiones las expresiones lambda no estan finas y prefiero usan una query con linq y no una expresión lambda.

    son dos tipos de notaciones, yo aplico una u otra segun cual se ve mas mantenible, pero deberias poder conseguir el mismo resultado

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 24 de enero de 2019 13:13

Todas las respuestas

  • Hola  José Francisco Castro

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te comento que estaremos realizando una revisión a profundidad acerca del inconveniente que se te está presentando.

    Proporcionaremos una respuesta lo más pronto posible.

    Gracias por usar los foros de MSDN.

    Pedro Alfaro
     ____

    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. 

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.
    viernes, 18 de enero de 2019 16:12
    Moderador
  • hola

    el condifiocnal no se arma de esa forma, nolo probe pero deberia ser algo como esto

     var query = from table in entidad.table
                 where ((IsSomething && table.field1== value1) || ( !IsSomething && table.field2 == value1))
    					&& table.filed3== value2 
    					&& table.filed3 < value3
                 select table;

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 18 de enero de 2019 17:46
  • Hola Leandro,

    Es otra posibilidad poner dos premisas en la query.

    Pero no es una respuesta del todo correcta o al menos para mi le falta algo más.

    La pregunta es cuando pongo en el inicio de la query esta sentencia ISomething? table.filed1: table.Fiedl2 al inicio no da problemas funciona, pero en el caso de ponerla al final es cuando toda la premisa de selección anterior a ella se la salta a la torera y coje solo esa premisa.

    Un caso similar de omisión en la premisa, me ha ocurrido con otra query donde pongo la siguiente expresión  lambda repository.find(oq => oq.field1 == id && oq.field2== service && oq.field3 < 40) la última premisa no la tiene en cuenta si la cambio esta misma al inicio si coje de forma correcta la query completa repository.find(oq => oq.field3 < 40 && oq.field1 == id && oq.field2== service) son querys sencillas que en sql no tienen ningún misterio pero que o bien como lambda expression o linq en algunos casos fallan y los dos trabajan con la interface IRepositoy donde separo el repositorio de la clase servicio y en el caso de que veas linq en que en ocasiones las expresiones lambda no estan finas y prefiero usan una query con linq y no una expresión lambda.

    No tengo muy claro si debemos cambiar de versión frameword 6.0.0 a 6.2.0 o que puede ocurrir.

    Gracias de todas formas por tu ayuda Leandro.

    jueves, 24 de enero de 2019 12:01
  • hola

    >>La pregunta es cuando pongo en el inicio de la query esta sentencia ISomething? table.filed1: table.Fiedl2 al inicio no da problemas funciona,

    no aconsejo uses esa forma de condicional

    >>me ha ocurrido con otra query donde pongo la siguiente expresión  lambda

    peor lo que planteas aqui es muy distinto a lo que planteaste en la consulta original, no defines ningun condicional al aplicar el filtro sobre un campo u otro

    >>en el caso de que veas linq en que en ocasiones las expresiones lambda no estan finas y prefiero usan una query con linq y no una expresión lambda.

    son dos tipos de notaciones, yo aplico una u otra segun cual se ve mas mantenible, pero deberias poder conseguir el mismo resultado

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 24 de enero de 2019 13:13