Как сгруппировать выражения в NHibernate? - PullRequest
2 голосов
/ 15 января 2010

Как я могу сгруппировать наборы выражений в NHibernate? Например, я хочу отфильтровать свой запрос так:

(ShowOnDate IS NULL OR ShowOnDate <= GETDATE()) AND (ExpirationDate IS NULL OR ExpirationDate >= GETDATE())

Я могу добавить 4 критерия отдельно, но не могу понять, как имитировать группировку парантеза. Спасибо!

РЕДАКТИРОВАНИЕ, чтобы показать мое окончательное решение:

            result = this.Session.CreateCriteria<Model.News>()
                .Add(Expression.IsNull("ExpirationDate") || Expression.Gt("ExpirationDate", DateTime.Now.Date))
                .Add(Expression.IsNull("ShowOnDate") || Expression.Le("ShowOnDate", DateTime.Now.Date))
                .AddOrder(new Order("SubmittedDate", true))
                .List<Model.News>();

Ответы [ 2 ]

4 голосов
/ 15 января 2010

Criteria API обеспечивает перегрузки операторов для || и && позволяет вам комбинировать ваши критерии следующим образом:

criteria.Add(
    (Restrictions.IsNull("ShowOnDate")
        || Restrictions.Le("ShowOnDate", DateTime.Now))
    && (Restrictions.IsNull("ExpirationDate")
        || Restrictions.Ge("ExpirationDate", DateTime.Now)));

Если вы хотите избежать перегруженных операторов, вы можете использовать конъюнкцию / дизъюнкцию для достижения того же эффекта (с большим увеличением многословия):

criteria.Add(Restrictions.Conjunction()
    .Add(Restrictions.Disjunction()
        .Add(Restrictions.IsNull("ShowOnDate"))
        .Add(Restrictions.Le("ShowOnDate", DateTime.Now))))
    .Add(Restrictions.Disjunction()
        .Add(Restrictions.IsNull("ExpirationDate"))
        .Add(Restrictions.Ge("ExpirationDate", DateTime.Now)))));
2 голосов
/ 15 января 2010

Есть также ограничения. И и Или, если вам нужно только объединить два выражения ...

criteria
    .Add(Restrictions.Or(Restrictions.IsNull("ShowOnDate"), Restrictions.Le("ShowOnDate", DateTime.Now)))
    .Add(Restrictions.Or(Restrictions.IsNull("ExpirationDate"), Restrictions.Ge("ExpirationDate", DateTime.Now)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...