使用NHibernate加入子查询

时间:2011-06-21 11:53:01

标签: nhibernate join subquery

是否可以在Criteria或QueryOver(NHibernate 3.1)中执行以下查询?

SELECT
 C.CustomerID, C.CustomerName,
 C.CustomerType, C.Address1, C.City,
 C.State, S.TotalSales
FROM
 Customers C
INNER JOIN
 (SELECT
    CustomerID, SUM(Sales) as TotalSales
  FROM
    Sales
  GROUP BY
    CustomerID) S
ON
 C.CustomerID = S.CustomerID

有一个类似的问题,但它已经很老了,从来没有回答过。也许随着NH团队最近的重大更新,这可以回答! NHibernate 2.1: LEFT JOIN on SubQuery with Alias (ICriteria)

由于

2 个答案:

答案 0 :(得分:1)

如果对象模型中的Customer和Sales之间没有关系,那么您无法使用我能想到的NH2.1中的任何查询方法将这两个对象连接在一起。

此外,您无法加入不相关实体的子查询,例如您的示例。

然而,您可以在NH2.1中执行此操作,这将为您提供类似的结果。

var customers = session.CreateCriteria<Customer>().Future<Customer>() //Get all Customers
var salesTotals = session.CreateCriteria<Sales>()
     .SetProjection(Projections.ProjectionList()
        .Add(Projections.Property("CustomerId"), "CustomerID")
        .Add(Projections.Sum("Sales"),"SalesTotal")
      )
   .SetResultTransformer(
        new AliasToBeanResultTransformer(typeof(SalesByCustomerDTO))
   ).Future<SalesByCustomerDTO>().List()

这将对服务器进行一次往返,发出两个查询,一个用于所有客户,另一个用于与customerid的销售总额。

然后,您可以使用LINQ将两个结果集连接到内存中。

答案 1 :(得分:0)

我的50美分 - &gt;您需要更改对象模型。因此,客户包含销售。

您的查询然后看起来像以下,这是更简洁和更好的面向对象。我不知道如何进行上面的查询,但它失败了使用ORM工具的目的。

from Customer c
inner join fetch c.Sales