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。注意自己:它总是CreateAlias ... – 2010-01-28 20:39:08