2010-12-10 125 views
9

我正在创建一个使用nhibernate和分页的mvc应用程序。我有一个父母>孩子的关系,我试图加载我的孩子记录。这一切工作正常。nhibernate,急切的加载和分页

我遇到的问题是分页。我想每页有15个项目。如果每个家长只有一个孩子,这完美地工作。问题是当父母有一个以上的孩子时。例如,如果父代有两个子记录,那么数据库实际上会选择15个记录,其中两个记录代表同一个父代,两个子代各有一个记录。因此,在我的数据视图中,看起来只有14条记录。

有没有人知道我可能会如何去获取我的页面计数由父只有仍然渴望加载我的子实体?
这将是一个面向公众的网站,所以我认为这不是一个好的主意,延迟加载,因为它会导致太多的旅行到服务器。

有没有内置到NHibernate中可能处理这个,我失踪?

感谢您的任何想法。

回答

0

您需要在查询中使用不同的根实体结果转换器。你还没有说过你是使用HQL还是Criteria,但是这两个API都是相似的。

// criteria 
criteria.SetResultTransformer(Transformers.DistinctRootEntity) 

这将强制结果集仅包含不同的父实体。

+2

我正在使用不同的根实体,但它仍然每次计数多个子项目,而不仅仅是计算不同的父项目。 – czuroski 2010-12-10 16:03:53

+0

@詹姆斯格雷戈里 - 你的建议将无法正常工作,因为分页通常表示为SELECT TOP(@ p0)....并且如果有急切的加载,您将加入,这将使一些实体显得远远超出TOP的限制。 – 2012-03-21 15:25:24

1

您可以使用fetch="subselect"来标记您的关联属性 - 这也可以确保您不会遇到大型笛卡尔产品的问题,但需要花费两次查询。

0

在您的子集合映射中使用batch-size提示可能是解决此问题的最佳/最简单的方法。有关进一步的讨论,请参阅我的回答similar question

+0

换句话说,这个答案不是使用急切加载,而是建议在延迟加载时启用批处理以切换到延迟加载,以避免N + 1性能问题。 – 2015-04-10 14:30:57