Nhibernate 带SetMaxResults或N+的距离变压器;1选择

Nhibernate 带SetMaxResults或N+的距离变压器;1选择,nhibernate,Nhibernate,我已经将这个问题发布到nh集团,但仍然没有得到答案,所以我将它发布在这里。 我在急切地加载子集合和使用SetMaxresults分页获得正确结果方面有点问题 假设我有一个简单的实体: public class Post { int Id {get; set;} Vote Votes {get; set;} } public class Vote { int Id {get; set;} } 开始

我已经将这个问题发布到nh集团,但仍然没有得到答案,所以我将它发布在这里。 我在急切地加载子集合和使用SetMaxresults分页获得正确结果方面有点问题

假设我有一个简单的实体:

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

public class Vote
{
                int Id {get; set;}
}
开始时,我加载了一个投票集合,除了N+1 SELECT语句外,它工作得很好

然后,我尝试急切地获取“投票”集合,该集合运行良好,但在数据库端存在重复项(如果一篇文章有3个投票,我们将在生成的SQL查询中有3行),我使用了DistincTrotentyTransformer,它也运行良好,除了SetMaxResults。由于SetMaxResults限制了数据库端的结果,因此在应用DistincTrotentyTransformer后,对象端的结果将少于预期的结果

我浏览了博客文章、StackOverflow问题,尝试了很多东西,比如Fetch、leftouterjoin、子查询、分离条件,但没有找到任何解决问题的方法。这里也描述了这个问题

现在我看到了三种解决方案,使用setMaxResults获得错误的结果编号,保持选择N+1,或者在延迟加载的“投票”集合上设置批大小,这就是我所做的。最新的问题是,NHProf为批处理选择生成“无界结果集”警报,因为它不是最优的

也许我错过了什么。有什么解决办法吗


提前感谢,

我将保持延迟加载,并尝试将批大小添加到映射中,以缓解选择n+1问题

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

..
基本上,将
批量大小设置为20将使向数据库发出的查询量减少20倍。如果没有设置它,如果您有99行,您将向数据库发出99个查询,而批大小设置为5


急切连接产生笛卡尔连接,因此分页将不正确。还要注意的是,
distinctroventy
只提供客户端数据过滤
而不是数据库本身的数据过滤。

我就是这么做的。我认为这是最好的解决方案,但是NHProf会为批处理选择生成“无界结果集”警报,因为它不是最优的。我想我们不可能全部:)无论如何+1是为了你的时间和我的发现的确认:)