2009-08-14 6 views
1

Как я могу создать дизъюнкции в NHibernate, что бы выполнить следующий SQL:Restrictions.Disjunction() между условием а и условием б ИЛИ условием С и условием г

Выберите * из MyTable
Где (conditionA = верно и conditionB = истина)
OR (conditionC = истина и conditionD = истина)

Из того, что я видел, то Disjuntion() принимает одиночные критерии и "ОШ" вместе. Можно ли группировать критерий вместе и «ИЛИ» против другой пары критериев?

Я надеюсь, что этот вопрос достаточно ясен.

Спасибо!

ответ

6

Это не совсем красиво, но вы должны написать это следующим образом:

.Add(
    Restrictions.Or(
     Restrictions.Conjunction().Add(Restrictions.Eq("columnA", true)).Add(Restrictions.Eq("columnB", true)), 
     Restrictions.Conjunction().Add(Restrictions.Eq("columnC", true)).Add(Restrictions.Eq("columnD", true)) 
); 
                   ) 
+0

я в конечном итоге делает это совершенно по-другому от этого из-за динамичного характера моего запроса строитель, но это отвечает на вопрос, как указано. Благодаря! Я использовал функции перегрузки оператора nhibernate для создания AbstractCriterion, а затем добавил весь абстракционный критерий к Restrictions.Disjunction(). –

1

Вы также можете использовать

.Add(
    Expression.Or(
     Expression.And(Expression.Eq("columnA",true), Expression.Eq("columnB",true)), 
     Expression.And(Expression.Eq("columnC",true), Expression.Eq("columnD",true)))