2012-02-15 19 views
6

LINQ to NHibernate elimina paréntesis en la cláusula where:Agrupación en condición está siendo cayó

session.Query<MyEntity>().Where(x => (x.MyProp1 < end && x.MyProp1 > start) || 
            (x.MyProp2 < end && x.MyProp2 > start)); 

Esto se traduce en la siguiente consulta (tenga en cuenta el paréntesis que falta):

select <columns> from MY_ENTITY where MY_PROP1 < :p0 and MY_PROP1 > :p1 or 
             MY_PROP2 < :p2 and MY_PROP2 > :p3; 

Este es un gran problema , porque cambia la condición de consulta significativamente.

¿Es esto un problema conocido o estoy haciendo algo mal?

+0

Hmm, parece que ha encontrado un error, puede dividir la consulta en dos y luego fusionarlas, pero aún así debería funcionar – mfeineis

+0

¿La consulta no se ejecuta realmente correctamente cuando se ejecuta? No puedo estar seguro, pero es posible que debido al orden de las operaciones no se requiera el paréntesis. Esto es al menos factible. – Servy

+1

@Servy: Lo has clavado. [Y tiene prioridad sobre OR] (http://docs.oracle.com/html/A95915_01/sqopr.htm#i1004611). Por favor, publícalo como una respuesta para que yo pueda aceptarlo. –

Respuesta

5

Dado que AND tiene una precedencia mayor en orden de operaciones que en O, los paréntesis no son necesarios, por lo que el proveedor de consultas no agrega la información redundante.

Para ayudar a recordar órdenes de operaciones, un AND booleano se considera análogo a la multiplicación (en un valor binario) y OR se considera análogo a la adición en valores binarios. Cuando se trata de álgebra booleana (en un entorno que no es de programación), no es infrecuente utilizar * para AND y + para OR.

+0

+1 para la explicación de por qué AND es lo primero. Estudié álgebra booleana hace 15 años y me olvidé por completo de la equivalencia del operador. –

1

AND tiene una precedencia mayor que OR, al igual que la multiplicación tiene mayor prioridad que la suma.

Por lo tanto, los paréntesis son redundantes y no existen en el árbol de expresiones.

+0

De hecho. Siempre pensé que era al revés ... –

Cuestiones relacionadas