表之间的Nhibernate ICreteria关系

时间:2009-10-26 22:19:29

标签: c# nhibernate .net-2.0

我有两个实体,即客户和订单,它们独立存在,并且在映射文件中没有定义任何关系。

现在我想让nhibernate给我以下查询的结果:

select customer.id,customer.name from customer,order
where customer.id = order.id
and order.status = "Open"

我尝试使用投影但是在检查输出sql时我看到Nhibernate生成了一个子查询,这不是我的意图(性能较差?)

public IList<Customer> GetOpenOrders()
{
                    DetachedCriteria orders = DetachedCriteria.For<Order>("orders")  
                    .SetProjection(Projections.Property("orders.id"));

                    ICriteria cret = session.CreateCriteria(typeof(Customer)) 
                    .Add(Subqueries.PropertyIn("id", orders)) 
                    .Add(Expression.Eq("Status", "open"));

                    return cret.List<Customer>();
}

是否可以使用标准执行此操作,还是有更好的方法来完成此类查询?

3 个答案:

答案 0 :(得分:1)

我不确定您是否可以使用ICriteria API执行此操作,因为ICriteria查询是针对特定对象创建的,但您应该能够使用HQL执行此操作:

select customer
from Customer customer, Orders order
where customer.id = order.id and order.status = 'Open'

答案 1 :(得分:1)

更好的方法是将客户与映射中的订单相关联。

  1. 客户类有一组订单作为财产。
  2. 订单类有一个客户作为财产。
  3. 两个
  4. 这在映射中要多做一些工作,但使用客户和订单对象编写查询和代码的工作量会减少。

答案 2 :(得分:1)

如果您的客户收到订单,那么您可以使用:

ICriteria cret = session.CreateCriteria(typeof(Customer)) 
                    .CreateCriteria("orders") 
                          .Add(Expression.Eq("Status", "open"));