阻止Fluent NHibernate选择n+1

阻止Fluent NHibernate选择n+1,nhibernate,select,fluent-nhibernate,Nhibernate,Select,Fluent Nhibernate,我有一个相当深的对象图5-6个节点,当我遍历其中的部分时,NHProf告诉我,我有一个选择N+1的问题 我知道的两种解决方案是 急切的孩子们 分解我的对象图并快速加载 我真的不想做这两件事,尽管我可能会在以后看到它的增长时把它分开 现在 是否可以通过FluentNHibernate告诉NHibernate,每当我尝试访问子项时,都要一次性加载它们,而不是在迭代时选择-n+1-ing 我还得到了无界的结果集,这大概是同一个问题,或者更确切地说,如果可能的话,将通过上面的解决方案来解决 整个图中的每

我有一个相当深的对象图5-6个节点,当我遍历其中的部分时,NHProf告诉我,我有一个选择N+1的问题

我知道的两种解决方案是

急切的孩子们 分解我的对象图并快速加载 我真的不想做这两件事,尽管我可能会在以后看到它的增长时把它分开

现在

是否可以通过FluentNHibernate告诉NHibernate,每当我尝试访问子项时,都要一次性加载它们,而不是在迭代时选择-n+1-ing

我还得到了无界的结果集,这大概是同一个问题,或者更确切地说,如果可能的话,将通过上面的解决方案来解决

整个图中的每个子集合只有大约20个成员,但20^5是很多,因此我不想在获得根时急于加载所有内容,只要在靠近它时获取所有子集合即可


编辑:事后诸葛亮。。。。如果我想在渲染子对象时引入分页,该怎么办?我是否必须在这里破坏我的对象图,或者我是否可以利用一些偷偷摸摸的方法来解决所有这些问题?

在我看来,您希望采用使用域模型的方法,而不是创建特定的nhibernate查询来处理此场景。有鉴于此,我建议您查看一下可以应用于集合的“批量大小”属性。Fluent NHibernate Fluent界面尚不支持此属性,但作为解决方案,您可以使用:

HasMany(x => x.Children).AsSet().SetAttribute("batch-size", "20")
由于缺乏关于具体场景的信息,我无法确定批量大小是否是理想的解决方案,但我当然建议您试一试。如果您还没有,我建议您阅读以下内容:

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

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

编辑:事后诸葛亮。。。。如果我 想在我需要的时候介绍分页吗 给孩子们上课?我必须休息吗 这里是我的对象图,还是有一些 我可以用鬼鬼祟祟来解决所有问题 这些问题


好的,如果您只加载子项,那么您可以将其分页:。但是,如果您想要像LoadParent和PageChildren这样的内容,那么我认为您不能这样做。

我觉得您希望采用使用域模型的方法,而不是创建特定的nhibernate查询来处理此场景。当然。我最不希望看到的是具体的查询。我来检查一下,tanote->fluent nh接口现在支持BatchSize属性