我有一个实体类型A.其中有很多B。 B实体有很多C。
我需要计算一个A实体有多少个C.如何使用NHibernate Criteria API完成这项工作?
使用LINQ to NHibernate我无法获得结果,因为它抛出异常(参见this question)
答案 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的价值。