如何在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>();
答案 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)));