NHibernate:返回带有分页子集合的对象的最简单方法?

时间:2010-11-26 10:27:41

标签: nhibernate paging

我想返回一个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.
}

更新

实际上,急切的装载要求并不那么重要。我只想在访问时加载子对象的分页子集。

2 个答案:

答案 0 :(得分:4)

您无法在同一查询中分页和加入 - 获取子集合。但你可以:

更新(针对新要求):

正如您所读,您可以使用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();

我还不完全确定它如何与儿童系列配合使用,但会尝试并更新此答案。