nHibernate:使用QueryOver的连接和析取

时间:2012-12-12 09:58:45

标签: nhibernate nhibernate-criteria queryover

假设我需要使用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 语法编写相同类型的查询?

3 个答案:

答案 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();
相关问题