NHibernate:计算儿童人数';儿童

NHibernate:计算儿童人数';儿童,nhibernate,api,count,entity,criteria,Nhibernate,Api,Count,Entity,Criteria,我有一个实体类型A,它有许多B。B实体有许多C 我需要计算一个实体有多少个C。如何使用NHibernate标准API实现这一点 使用LINQ to NHibernate I无法获得结果,因为它会引发异常(请参见)如果您使用C作为查询的起点,而不是A,则此查询会变得更简单。这是可能的,因为根据您在其他问题中显示的映射,您使用了双向映射 我这样做的方法是找到所有有一个B的C,它有一个给定的a,然后计算找到的C 要在C的B上添加约束,可以添加别名,然后向该别名添加限制。要执行计数查询而不是返回找到的

我有一个实体类型A,它有许多B。B实体有许多C

我需要计算一个实体有多少个C。如何使用NHibernate标准API实现这一点



使用LINQ to NHibernate I无法获得结果,因为它会引发异常(请参见)

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

我这样做的方法是找到所有有一个B的C,它有一个给定的a,然后计算找到的C

要在C的B上添加约束,可以添加别名,然后向该别名添加限制。要执行计数查询而不是返回找到的Cs,可以使用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>();

    // ...
}
正如您所看到的,它是一个双向连接,因为NHibernate足够聪明,可以意识到它不需要和一个表连接就可以获得BSA的id。相反,它只查看B的IdA值

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