在nHibernate查询中左连接挣扎
我努力在nHibernate查询中复制一个简单的SQL左连接。 SO上的其他答案导致我更加困惑,以解决在域查询中解决左连接问题的最明智的方法。
例:
2个DB表格:
Customer
CustId INT PK
Orders
OrderId INT PK
CustId INT FK
Status INT
1 SQL查询:
Select c.CustId from Customer c
left join Orders o on o.CustId = c.CustId and o.Status = 2
where o.OrderId is null
这将检索没有状态2订单的客户的唯一列表,请注意,它还包括根本没有订单的客户。 这是一个简化这个问题的人为的例子,但这种查询类型非常有用,而且不容易做任何其他的方式。
想象一下,“顾客”和“订单”的映射只是反映了上面的示例表。
是否有一种简单的方法可以在查询中提取nHibernate中唯一的非状态2客户列表,而不诉诸SQL查询或结束于选择n + 1场景?
查询首选项:
1 linq-to-nhibernate
2 QueryOver
3 HQL
4标准。
谢谢。
请参阅http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/queryhql.html#queryhql-joins。 这是Hibernate的参考,而不是nHibernate的参考,但我会假设他们的工作是一样的(顺便说一下,这篇文章似乎证实了这一点):
您可以使用HQL with关键字提供额外的连接条件。
来自Cat作为猫,将kit.kittens与kitten.bodyWeight> 10.0一起加入cat.kittens
所以,就你而言,它应该看起来像
select c.CustId from Customer c
left join Orders o with o.Status = 2
NHibernate 3.0有一个ICriteria .CreateAlias的重载方法,它需要4个参数,最后一个参数是withClause。
这里是一个例子:
DetachedCriteria criteria = DetachedCriteria.For<Models.BO.Customer>("customer")
.CreateAlias(ReflectionHelper.PropertyName<Models.BO.Customer>(x => ((Models.BO.Interfaces.ICustomerQueryOnly) x).Tasks),
"activeTasks", JoinType.LeftOuterJoin, Restrictions.IsNotNull("activeTasks.LockedBy")
)
.CreateAlias(ReflectionHelper.PropertyName<Models.BO.Customer>(x => ((Models.BO.Interfaces.ICustomerQueryOnly) x).Tasks2),
"availableTasks", JoinType.LeftOuterJoin,
availableTasksRestraction
)
.Add(Restrictions.Eq("CustomerBase", _customerBase))
.Add(Restrictions.Eq("IsActive", true));
最终结果如下:
FROM Customers c
left join Tasks t on t.customerId = c.Id and (t.DeletedDate is null and
t.lockedById is null and [etc])
left join Tasks activetasks [etc]
where [...]
在这个例子中,我需要为每个客户提取所有客户和可用任务的数量以及活动任务的数量。
如果实体不相关并且您不想映射关系,则可以使用theta连接。 看这里
也许类似
Select c from Customer c, Order o
where o.CustId = c.CustId and o.Status = 2
链接地址: http://www.djcxy.com/p/60995.html