2009-02-24 34 views
5

我有一个相当深的对象图(5-6节点),当我遍历它的一部分NHProf告诉我我有一个“选择N + 1”的问题(我做)。防止流利NHibernate的选择n + 1

这两种方案我所知道的是

  1. 渴望负载孩子
  2. 掰开我的对象图(和贪婪加载)

我真的不希望做任何(虽然我可能随着它的增长,将图分开)

现在......

是否有可能告诉NHibernate(使用FluentNHibernate)每当我尝试访问子进程时,一次加载它们,而不是select-n + 1-ing,因为我迭代了它们?

我还得到了“无限结果集”,这大概是同样的问题(或者说,如果可能,将通过上述解决方案来解决)。

每个孩子集合(在整个图中)将只有大约20个成员,但20^5是很多,所以我不想急于加载一切,当我得到的根,但只是得到所有的儿童收集,只要我靠近它。

编辑:一个事后....如果我想介绍分页,当我想要呈现儿童?我是否需要在这里打破我的对象图,还是有一些潜行我可以用来解决所有这些问题?

回答

9

在我看来,你想追求使用你的域模型的方法,而不是创建一个特定的nhibernate查询来处理这种情况。鉴于此,我建议你看看你可以应用到你的集合的批量大小属性。流利的NHibernate的流畅接口还不支持此属性,但作为一种解决方法,您可以使用:

HasMany(x => x.Children).AsSet().SetAttribute("batch-size", "20") 

鉴于对您的具体情况普遍缺乏信息,我不能肯定地说批量大小是否是理想的解决方案,但我当然建议你放弃它。如果你还没有准备好,我建议你阅读这些:

http://www.nhforge.org/wikis/howtonh/lazy-loading-eager-loading.aspx

http://nhibernate.info/doc/nhibernate-reference/performance.html

NHibernate的性能文档将解释如何批量大小的作品。

编辑:我不知道有任何方式来从您的域模型页面。我建议你为需要分页的场景编写NH查询。

+0

”这听起来对你来说,你想追求的是使用你的域模型的方法,而不是创建一个特定的nhibernate查询来处理这种情况。“肯定。我想要的最后一件事是具体的查询。我检查了这些东西,ta – 2009-02-24 13:15:12

0

编辑:事后....如果我 要介绍的页面时,我想 渲染的孩子吗?我是否必须在这里打破 我的对象图,还是有一些 偷偷摸摸我可以用来解决所有这些问题 ?

那么,如果你只加载孩子,那么你可以页面:)。但是,如果你想要的东西如:LoadParent和PageChildren,那么我认为你不能这样做。“