我想返回一个父对象,其中子集合急切地加载了所请求的子对象页面(子集)。 实现这一目标的最佳方法是什么? 过滤器?可以使用 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.
}
更新:
其实,急切加载的需求并不那么重要。 我只想在访问子对象时加载子对象的分页子集。
您无法在同一查询中对子集合进行分页和连接获取。但你可以:
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();
只需阅读 NHibernate 文档“查询提示和技巧”部分 (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();
我还不完全确定这将如何与子集合一起使用,但会尝试并更新此答案。