以一对多关系获取父级的最大记录

时间:2013-02-21 05:01:22

标签: c# nhibernate

假设两个类有ParentClass和ChildClass。父母有一个孩子的包 我试过.SetResultTransformer(new DistinctRootEntityResultTransformer())和distinct()过滤掉重复和获取时.SetMaxResults()我没有在ParentClass级别获得它。

是否有任何可用于使.SetMaxResults()在ParentClass级别而不是在ChildClass上工作的东西。我需要在父级别强制执行maxresults。

示例具有6个子节点且setmaxresults(6)和distinct()的ParentClass将导致我只有一个ParentClass,而我在查询中寻找更多5个ParentClass记录。我的标准包括3个与父记录匹配的参数,2个与子记录匹配

1 个答案:

答案 0 :(得分:0)

一种解决方案可能是使用子查询。文档14.11. Subqueries

它将像内部选择一样工作。子查询将包含WHERE子句,其中包含2个与Child匹配的参数,以及一个返回Parent.ID的投影。然后,主查询将包含3个参数来过滤Parent以及调用子查询以匹配Parent ID

子查询:

var sub = DetachedCriteria
 .For<Child>()
 .Add(Restrictions.In("FirsChildProperty", new int[] {1, 2 })) // WHERE
 .Add(Restrictions.... // Second
 .SetProjection(Projections.Property("Parent.ID")); // Parent ID as a SELECT clause

主查询:

var criteria = session.CreateCriteria<Parent>()
 .Add(Restrictions.In("FirsParentProperty", new int[] {1, 2 })) // WHERE
 .Add(Restrictions.... // the second
 .Add(Restrictions.... // the third
 // no filter to match children
 .Add(Subqueries.PropertyIn("ID", sub)); // Parent.ID in (select
 // now paging just over Parent table....
 .SetFirstResult(100) // skip some rows
 .SetMaxResults(20)   // take 20

var result = criteria.List<Parent>();