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

问题描述 投票:0回答:2

我想返回一个父对象,其中子集合急切地加载了所请求的子对象页面(子集)。 实现这一目标的最佳方法是什么? 过滤器?可以使用 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.
}

更新:

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

pagination nhibernate
2个回答
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
投票

只需阅读 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();

我还不完全确定这将如何与子集合一起使用,但会尝试并更新此答案。

© www.soinside.com 2019 - 2024. All rights reserved.