在nHibernate查询中挣扎于左连接

在nHibernate查询中挣扎于左连接,nhibernate,hql,linq-to-nhibernate,queryover,Nhibernate,Hql,Linq To Nhibernate,Queryover,我正在努力在nHibernate查询中复制一个简单的sql左连接。其他答案让我更加困惑,在域查询中处理左连接最聪明的方法是什么 例如: 2数据库表: 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

我正在努力在nHibernate查询中复制一个简单的sql左连接。其他答案让我更加困惑,在域查询中处理左连接最聪明的方法是什么

例如:

2数据库表:

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下没有订单的客户的唯一列表, 注意,它还包括根本没有订单的客户。 这是一个人为的例子来简化这个问题,但是这种类型的查询非常有用,并且不容易用其他方法来完成

想象一下“Customer”和“Orders”的nh映射,它们只是反映了上面的示例表

有没有一种简单的方法可以在查询中提取nHibernate中唯一的、非状态2的客户列表,而无需求助于SQL查询或最终选择n+1方案

查询首选项:

1 linq到nhibernate
2查询版本
3 HQL
4标准

谢谢。

请参阅。这是Hibernate引用,而不是nHibernate引用,但我假设它们的工作原理相同(顺便说一句,似乎证实了这一点):

您可以使用HQL with关键字提供额外的连接条件

从猫变成猫 左图:加入猫。小猫为小猫 带小猫。体重>10.0

所以,在你的情况下,它应该是

select c.CustId from Customer c
left join Orders o with o.Status = 2
看。这是Hibernate引用,而不是nHibernate引用,但我假设它们的工作原理相同(顺便说一句,似乎证实了这一点):

您可以使用HQL with关键字提供额外的连接条件

从猫变成猫 左图:加入猫。小猫为小猫 带小猫。体重>10.0

所以,在你的情况下,它应该是

select c.CustId from Customer c
left join Orders o with o.Status = 2

如果实体不相关,并且您不希望映射关系,则可以使用θ连接。看

也许像

Select c from Customer c, Order o 
where o.CustId = c.CustId and o.Status = 2

如果实体不相关,并且您不希望映射关系,则可以使用θ连接。看

也许像

Select c from Customer c, Order o 
where o.CustId = c.CustId and 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));

在本例中,我需要提取所有客户以及每个客户的可用任务数和活动任务数

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));

在本例中,我需要提取所有客户以及每个客户的可用任务数和活动任务数

谢谢,我现在通过HQL实现了这一点,尽管它确实依赖于映射的所有连接关联-我希望创建一个查询来连接不相关的域对象,但我想映射关联是有意义的。是的,映射关联确实有意义。我认为如果不映射它们,就不可能完成您想做的事情。谢谢,我现在已经通过HQL实现了这一点,尽管它确实依赖于映射的所有联接关联-我希望创建一个查询来联接不相关的域对象,但我想映射关联是有意义的。是的,映射关联确实有意义。我认为如果不映射它们,就不可能做你想做的事情。我想做类似的事情,但找不到一种方法使左连接查询能够使用这种类型的连接。很遗憾,你不能根据定义进行外部θ连接,因为这两个元素都需要满足条件。因此,为了使用HQL,您需要按照Isurucanu的建议映射关联。我想这样做,但找不到一种方法使左连接查询能够使用这种类型的joinAh,很遗憾,您无法根据定义进行外部theta连接,因为这两个元素都需要满足条件。因此,为了使用HQL,您需要按照Isurucanu的建议映射关联。谢谢-最后选择了HQL解决方案,但很高兴了解withClause。谢谢-最后选择了HQL解决方案,但很高兴了解withClause。