Группировка в состоянии отбрасывается - PullRequest
6 голосов
/ 15 февраля 2012

LINQ для NHibernate удаляет скобки в предложении where:

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

Это приводит к следующему запросу (обратите внимание на пропущенные скобки):

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

Это огромная проблема, поскольку она значительно меняет условие запроса.

Это известная проблема или я что-то не так делаю?

Ответы [ 2 ]

5 голосов
/ 15 февраля 2012

Поскольку AND имеет более высокий приоритет в порядке операций над OR, скобки не нужны, поэтому поставщик запросов не добавляет избыточную информацию.

Чтобы помочь запомнить порядок операций, логическое ANDсчитается аналогом умножения (для двоичного значения), а ИЛИ - аналогом сложения для двоичных значений.При работе с булевой алгеброй (в непрограммируемой среде) на самом деле нередко использовать * для AND и + для OR.

1 голос
/ 15 февраля 2012

AND имеет более высокий приоритет, чем OR, точно так же как умножение имеет более высокий приоритет, чем сложение.

Следовательно, круглые скобки являются избыточными и не существуют в дереве выражений.

...