我想返回一个父对象,其中子集合急切地加载了所请求的子对象页面(子集)。实现这一目标的最佳方法是什么?过滤器?可以使用 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.
}
UPDATE:
事实上,急切加载的需求并不那么重要。我只想在访问子对象时加载子对象的分页子集。
您不能在同一查询中对子集合进行分页和连接获取。但是你可以:
- 使用查询来获取(分页的)父级,并使用一个查询来加载这些父级的所有集合(阅读http://ayende.com/Blog/archive/2010/01/16/eagerly-loading-entity-associations-efficiently-with-nhibernate.aspx http://ayende.com/Blog/archive/2010/01/16/eagerly-loading-entity-associations-efficiently-with-nhibernate.aspx对于某些概念)
- Set
batch-size
在集合上适应您的页面大小。这或多或少会自动完成相同的任务。甚至还有一个补丁可以动态更改此设置:https://nhibernate.jira.com/browse/NH-2316 https://nhibernate.jira.com/browse/NH-2316
Update(针对新要求):
正如您所阅读的,您可以使用session.CreateFilter
过滤/排序/分页子集合。这是可行的,并且到处都支持它。
此外,还有一个补丁(NH-2319 https://nhibernate.jira.com/browse/NH-2319;我将转换为允许使用 Linq 的插件,因为它不太可能在主干中被接受。它仅限于某些集合类型,并且要求关系是双向的,但允许以下内容:
var parent = GetParent();
var secondPageOfChildrenByName = parent.Children.AsQueryable()
.OrderBy(c => c.Name)
.Skip(PageSize * 1)
.Take(PageSize)
.ToList();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)