2012-02-15 8 views
6

LINQ to NHibernate rimuove parentesi nella clausola where:raggruppamento in condizione è che è caduto

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

Il risultato è la seguente query (si noti la parentesi mancante):

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

Questo è un problema enorme , perché modifica significativamente la condizione della query.

Si tratta di un problema noto o sto facendo qualcosa di sbagliato?

+0

Hmm, sembra che tu abbia trovato un bug, potresti dividere la query in due e in seguito unirle, ma comunque dovrebbe funzionare – mfeineis

+0

La query non viene effettivamente eseguita correttamente quando viene eseguita? Non posso esserne sicuro, ma è possibile che a causa dell'ordine delle operazioni le parentesi non siano richieste. Questo è almeno fattibile. – Servy

+1

@Servy: lo hai inchiodato. [E ha la precedenza su OR] (http://docs.oracle.com/html/A95915_01/sqopr.htm#i1004611). Si prega di postare come risposta in modo che io possa accettarlo. –

risposta

5

Poiché AND ha una precedenza più alta in ordine di operazioni su OR le parentesi non sono necessarie, quindi il provider di query non aggiunge le informazioni ridondanti.

Per ricordare gli ordini di operazioni, un valore booleano AND è analogo alla moltiplicazione (su un valore binario) e OR è considerato analogo all'aggiunta su valori binari. Quando si ha a che fare con l'algebra booleana (in un ambiente non di programmazione) in realtà non è raro usare * per AND e + per OR.

+0

+1 per la spiegazione del perché AND viene prima. Ho studiato l'algebra booleana circa 15 anni fa e mi ero completamente dimenticato dell'equivalenza dell'operatore. –

1

AND ha precedenza più alta di OR, proprio come la moltiplicazione ha precedenza più alta di aggiunta.

Pertanto, le parentesi sono ridondanti e non esistono nell'albero delle espressioni.

+0

Infatti. Ho sempre pensato che fosse il contrario ... –

Problemi correlati