假设我需要使用nHibernate进行渲染的SQL查询。 SQL查询的 WHERE 子句由三个 OR 语句组成,每个语句都包含一个条件列表。例如:
SELECT *
FROM MyTable
WHERE
(OrderId = 1 and ItemId = 100)
OR
(OrderId = 2 and ItemId = 200)
OR
(OrderId = 3 and ItemId = 300)
使用nHibernate的 Criteria 语法,我可以使用析取来实现这个:
var disjunction = Restrictions.Disjunction();
foreach (var tuple in OrdersAndLineItems)
{
var conjunction = Restrictions.Conjunction();
var order = tuple.Item1;
var lineitem = tuple.Item2;
conjunction.Add(Restrictions.Eq("OrderId", order.Id));
conjunction.Add(Restrictions.Eq("LineItemId", lineitem.Id));
disjunction.Add(conjunction);
}
var result = Session.CreateCriteria<SomeClass>().Add(disjunction).ToList();
如何使用nHibernate 3.x中的 QueryOver 语法编写相同类型的查询?
答案 0 :(得分:1)
至少在NH 3.0.0.4000版中,有多个Add方法重载。其中一个是具有可用于您的案例的通用参数,例如:
disjuction.Add<TypeinWhichPrimaryKeyPropertyExists>(x => x.PrimaryKey == 1)
答案 1 :(得分:0)
对于要测试相等性的限制,请使用“Where”,例如:
Restrictions.Where<SomeClass>(x => x.OrderId == order.Id)
答案 2 :(得分:-3)
没关系 - 在我发布后不久,我偶然发现an earlier StackOverflow post提供了我正在寻找的答案。这是我使用 QueryOver 语法重写的原始示例:
var disjunction = Restrictions.Disjunction();
foreach (var tuple in OrdersAndLineItems)
{
var conjunction = Restrictions.Conjunction();
var order = tuple.Item1;
var lineitem = tuple.Item2;
conjunction.Add(Restrictions.On<SomeClass>(x => x.OrderId).Equals(order.Id));
conjunction.Add(Restrictions.On<SomeClass>(x => x.LineItemId).Equals(lineitem.Id));
disjunction.Add(conjunction);
}
var result = Session.CreateCriteria<SomeClass>().Add(disjunction).ToList();