2012-02-15 18 views
6

LINQ do NHibernate usuwa nawias w przypadkach, gdy klauzula:Grupowanie stan jest spadła

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

Wynika to w poniższym zapytaniu (nota brakujący nawias):

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

jest to ogromny problem , ponieważ znacząco zmienia warunek zapytania.

Czy jest to znany problem, czy też robię coś nie tak?

+0

Hmm, wygląda na to, że znalazłeś błąd, możesz podzielić zapytanie na dwie części, a później je scalić, ale to powinno zadziałać. – mfeineis

+0

Czy zapytanie właściwie nie działa poprawnie po uruchomieniu? Nie mogę być tego pewien, ale możliwe jest, że ze względu na kolejność operacji nawias nie jest wymagany. Jest to co najmniej wykonalne. – Servy

+1

@Servy: Przybiłeś to. [I ma pierwszeństwo przed LUB] (http://docs.oracle.com/html/A95915_01/sqopr.htm#i1004611). Proszę zaksięguj to jako odpowiedź, abym mógł ją zaakceptować. –

Odpowiedz

5

Bo i ma wyższy priorytet w kolejności operacji przejęcia lub nawias nie są potrzebne, więc operator kwerendy nie dodawać w nadmiarowej informacji.

Aby pomóc pamiętać zlecenia operacji, wartość logiczną i jest uważany za analogiczne do mnożenia (na wartość binarną) i czy jest uważany analogiczne dodaniem na wartościach binarnych. Kiedy mamy do czynienia z algebrą boolowską (w środowisku innym niż programistyczne), często nie używa się * dla AND i + dla OR.

+0

+1 za wyjaśnienie, dlaczego ORAZ jest na pierwszym miejscu. Studiowałem algebrę boolowską około 15 lat temu i zupełnie zapomniałem o równoważności operatora. –

1

AND ma wyższy priorytet niż OR, podobnie jak mnożenie ma wyższy priorytet niż dodawanie.

Dlatego nawiasy są zbędne i nie istnieją w drzewie ekspresji.

+0

Rzeczywiście. Zawsze uważałem, że jest odwrotnie ... –