2011-05-10 111 views
0

我已经将此问题发布到nh组,但仍然没有得到答案,所以我在此处发布它。 我有一个小问题,急切地加载子集合并使用SetMaxresults获得正确的分页结果。DistinctRootEntityTransformer with SetMaxResults或N + 1 SELECT

比方说,我有一个简单的实体:

public class Post 
{ 
       int Id {get; set;} 
       Vote Votes {get; set;} 
} 

public class Vote 
{ 
       int Id {get; set;} 
} 

在开始的时候我做了一个投票收集延迟加载和它的工作很好除了N + 1 SELECT语句。

然后我试着急切地抓取'Votes'集合,它运行良好,但在数据库方面有重复(如果一个Post有3个投票,我们将在结果SQL查询中有3行)我使用了DistinctRootEntityTransformer,除了使用SetMaxResults。因为SetMaxResults限制了数据库端的结果,所以在应用DistinctRootEntityTransformer之后,我们在对象端的结果会更少。

我翻看博客文章,StackOverflow的问题,尝试了许多事情,如Fetch,LeftOuterJoins,子查询,分离标准,但没有找到我的问题的任何解决方案。这个问题也在这里描述http://www.interworks.com/blogs/banderton/2009/06/26/nhibernate-eager-loading-collections-rootentityresulttransformer-and-setm

现在我看到三个解决方案,用setMaxResults获取不正确的结果数字,保留SELECT N + 1,或者在懒加载的“投票”集合上设置批量大小,这就是我所做的。最新的问题是,NHProf为批量选择产生“无限结果集”警报,因为它不是最优的。

也许我错过了一些东西。有没有解决方案可以正确解决?

由于提前,

回答

2

我会继续延迟加载,然后尝试在batch size到你的映射来缓解选择N + 1点的问题。

<bag name="Votes" cascade="all" batch-size="20"> 
.. 
</bag> 

,基本建立batch-size 20将通过20个氨基酸的因素没有它设置,如果你有99行,你会发出99个查询到DATABSE与批量大小设置你减少向数据库发出的查询量会发出5.

急切加入产生Cartesian join,因此分页将不正确。另请注意,DistinctRootEntity实际上仅在数据库本身上提供客户端过滤数据NOT

+0

这就是我所做的。我认为这是最好的解决方案,但NHProf为批量选择产生“无限结果集”警报,因为它不是最优的。我认为我们不能拥有所有的:)反正你的时间+1和确认我的发现:) – 2011-05-10 11:03:39