如何在NHibernate中对表达式进行分组?

时间:2010-01-14 22:30:53

标签: nhibernate

如何在NHibernate中对表达式组进行分组?例如,我想像这样过滤我的查询:

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

我可以单独添加4个标准,但我无法弄清楚如何模拟paranthesis分组。谢谢!

编辑以显示我的最终解决方案:

            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 个答案:

答案 0 :(得分:4)

Criteria API为||提供运算符重载和&amp;&amp;允许您组合这样的标准:

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

如果你想避免重载运算符那么你可以使用conjuction / disjunction来实现相同的效果(大量增加):

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)))));

答案 1 :(得分:2)

还有Restrictions.And和Or,当你只需要组合两个表达式时......

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