NHibernate:计数儿童的孩子

NHibernate:计数儿童的孩子

问题描述:

我有一个实体类型A.其中有许多B的。 B实体有许多C。NHibernate:计数儿童的孩子

我需要计算一个实体有多少个C。如何使用NHibernate Criteria API完成这项工作?


使用LINQ to NHibernate的我是无法得到的结果,因为它抛出一个异常(见this question

这个查询变得更简单,如果你使用C作为开始查询点,而不是A.这根据您在其他问题中显示的映射,您可以使用双向映射。

我会这样做的方式是找到所有具有给定A的B的Cs,然后计算找到的Cs。

要在C的B上添加约束,可以添加一个别名,然后向该别名添加限制。要执行计数查询而不是返回找到的Cs,可以使用SetProjection方法并指定计数投影。由于计数投影返回单个整数值,因此请使用UniqueResult获取计数。

using (ISession session = SessionFactorySingleton.OpenSession()) 
{ 
    int numberOfCsForA1 = session.CreateCriteria<C>() 
     .SetProjection(Projections.Count("Id")) 
     .CreateAlias("B", "b") 
     .Add(Restrictions.Eq("b.A.Id", a1.Id)) 
     .UniqueResult<int>(); 

    // ... 
} 

此查询生成的SQL是这样的:

SELECT count(this_.Id) as y0_ 
    FROM [C] this_ 
    inner join [B] b1_ 
    on this_.IdB=b1_.Id 
    WHERE b1_.IdA = @p0;@p0 = 12 

正如你可以看到,这是一个双向的加入,因为NHibernate的是足够聪明,意识到它并不需要加入A表获得B的ID。相反,它只是查看B的IdA值。

+1

+1。注意自己:它总是CreateAlias ... – 2010-01-28 20:39:08