NHibernate:算儿童的孩子

时间:2010-01-28 13:19:25

标签: nhibernate api count entity criteria

我有一个实体类型A.其中有很多B。 B实体有很多C。

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


使用LINQ to NHibernate我无法获得结果,因为它抛出异常(参见this question

1 个答案:

答案 0 :(得分:2)

如果您使用C作为查询的起点而不是A,则此查询会变得更简单。这是可行的,因为您使用双向映射,根据您在其他问题中显示的映射。

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

要在C的B上添加约束,您可以添加别名,然后为该别名添加限制。要执行计数查询而不是返回找到的C,可以使用SetProjection方法并指定Count投影。由于计数投影返回单个整数值,因此请使用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表连接来获得Bs A的id。相反它只是看看IdA B的价值。