nHibernate:使用QueryOver的连接和析取

nHibernate:使用QueryOver的连接和析取,nhibernate,nhibernate-criteria,queryover,Nhibernate,Nhibernate Criteria,Queryover,假设我需要使用nHibernate呈现一个SQL查询。SQL查询的WHERE子句由三个或语句组成,每个语句都包含一个条件列表。例如: SELECT * FROM MyTable WHERE (OrderId = 1 and ItemId = 100) OR (OrderId = 2 and ItemId = 200) OR (OrderId = 3 and ItemId = 300) disjuction.Add<TypeinWhichPri

假设我需要使用nHibernate呈现一个SQL查询。SQL查询的WHERE子句由三个语句组成,每个语句都包含一个条件列表。例如:

SELECT * 
FROM MyTable 
WHERE
    (OrderId = 1 and ItemId = 100) 
    OR
    (OrderId = 2 and ItemId = 200)
    OR
    (OrderId = 3 and ItemId = 300)
disjuction.Add<TypeinWhichPrimaryKeyPropertyExists>(x => x.PrimaryKey == 1)
使用nHibernate的标准语法,我可以使用析取来实现这一点:

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();
var disjunction=Restrictions.disjunction();
foreach(OrdersAndLineItems中的变量元组)
{
var conjunction=Restrictions.conjunction();
变量顺序=tuple.Item1;
var lineitem=tuple.Item2;
连接词.Add(Restrictions.Eq(“OrderId”,order.Id));
连接词.Add(Restrictions.Eq(“LineItemId”,lineitem.Id));
析取。加(连词);
}
var result=Session.CreateCriteria().Add(析取).ToList();
我将如何使用nHibernate 3.x中的QueryOver语法编写相同类型的查询?

没关系——在我发布后不久,我偶然发现它提供了我想要的答案。下面是使用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();
var disjunction=Restrictions.disjunction();
foreach(OrdersAndLineItems中的变量元组)
{
var conjunction=Restrictions.conjunction();
变量顺序=tuple.Item1;
var lineitem=tuple.Item2;
连接.Add(限制.On(x=>x.OrderId).Equals(order.Id));
conjunction.Add(Restrictions.On(x=>x.LineItemId).Equals(lineitem.Id));
析取。加(连词);
}
var result=Session.CreateCriteria().Add(析取).ToList();

对于要测试相等性的限制,请使用“where”,例如:

Restrictions.Where(x=>x.OrderId==order.Id)

至少在NH版本3.0.0.4000中存在多个重载的Add方法。其中之一是具有可用于您的案例的通用参数,例如:

SELECT * 
FROM MyTable 
WHERE
    (OrderId = 1 and ItemId = 100) 
    OR
    (OrderId = 2 and ItemId = 200)
    OR
    (OrderId = 3 and ItemId = 300)
disjuction.Add<TypeinWhichPrimaryKeyPropertyExists>(x => x.PrimaryKey == 1)
disjuction.Add(x=>x.PrimaryKey==1)

这是不正确的。Equals是对象上的一个方法,与QueryOver API无关。