nHibernate:使用QueryOver的连接和析取
假设我需要使用nHibernate呈现一个SQL查询。SQL查询的WHERE子句由三个或语句组成,每个语句都包含一个条件列表。例如: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
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无关。