我想返回一个Parent对象,其中children子集急切地加载了子对象的请求页面(子集)。实现这一目标的最佳方法是什么?过滤器?是否可以使用ICriteria查询?
我正在使用.SetFirstResult()和.SetMaxResults()来对聚合根结果的集合进行分页,但是是否可以利用聚合根来选择子结果的页面?
这些方面的东西:
public class Parent{
int Id;
IList<Child> Children;
}
public Parent GetWithPagedChildren(int id, int page, int pageSize, out int count)
{
//Query
return Parentresult; //With one page of children populated.
}
更新
实际上,急切的装载要求并不那么重要。我只想在访问时加载子对象的分页子集。
答案 0 :(得分:4)
您无法在同一查询中分页和加入 - 获取子集合。但你可以:
batch-size
设置为您的页面大小。这将或多或少完全相同,但会自动完成。甚至还有一个补丁允许动态更改:https://nhibernate.jira.com/browse/NH-2316 更新(针对新要求):
正如您所读,您可以使用session.CreateFilter
过滤/排序/分页子集合。这是有效的,它在任何地方都得到支持。
此外,还有一个补丁(NH-2319;我将转换为一个插件,因为它不太可能在主干中被接受)允许使用Linq。它仅限于某些集合类型,并且要求关系是双向的,但允许以下内容:
var parent = GetParent();
var secondPageOfChildrenByName = parent.Children.AsQueryable()
.OrderBy(c => c.Name)
.Skip(PageSize * 1)
.Take(PageSize)
.ToList();
答案 1 :(得分:1)
只需阅读NHibernate Documentation 'Querying tips and tricks' section (13.13)中的这一位:
//Collections are pageable by using the IQuery interface with a filter:
IQuery q = s.CreateFilter( collection, "" ); // the trivial filter
q.setMaxResults(PageSize);
q.setFirstResult(PageSize * pageNumber);
IList page = q.List();
我还不完全确定它如何与儿童系列配合使用,但会尝试并更新此答案。