2011-07-12 42 views
0

好吧我试图加载我的用户对象(关注者,关注,PostLikes,CommentLikes)上的许多到很多集合。但是,当我使用QueryOver对这些集合执行左连接时,它将返回比应该返回更多的记录。nHibernate QueryOver执行一个SubSelect加载一个集合,而不是一个加入

我用SQL Profiler查看了SQL,它似乎不是仅生成4个连接而是生成8创建一个有点循环的查询。这是我目前的查询。

User userAlias = null; 
     User followingAlias = null; 
     User followersAlias = null; 
     Post postLikesAlias = null; 
     Comment commentLikesAlias = null; 

     var entity = Session.QueryOver(() => userAlias) 
      .Where(x => x.Id == id) 
      .Left.JoinAlias(() => userAlias.Followers,() => followersAlias) 
      .Left.JoinAlias(() => userAlias.Following,() => followingAlias) 
      .Left.JoinAlias(() => userAlias.PostLikes,() => postLikesAlias) 
      .Left.JoinAlias(() => userAlias.CommentLikes,() => commentLikesAlias) 
      .SingleOrDefault(); 

     ReleaseCurrentSession(); 

     return entity; 

无论如何,当我没有选择性地加载东西,并通过我流利的映射使用急切的加载。集合加载完美。我再次查看了Sql Profiler,它似乎为每个集合执行一个单独的选择查询。有没有一种方法可以使用QueryOver来代替使用联接?我知道在你的映射中你可以指定FetchTypes,但是当我这样做,只使用.Fetch(x => x.Followers)等它仍然会产生连接!

在先进的感谢,

乔恩

回答

0

尝试使用这个作为你的查询结束。

.TransformUsing(new DistinctRootEntityResultTransformer()) 
.SingleOrDefault(); 

.TransformUsing(new DistinctRootEntityResultTransformer()) 
.List(); 

和访问的第一个项目。

0

你不能这样做。 NHibernate不会为集合发出单独的查询。因此,查询集合很容易,因为只处理根目录中的单个集合。

您可以使用CreateMultiCriteria()创建单独的查询,并将它们转换为一个结果。

或者,我相信你也可以在每个查询中使用.Future(),这样它们就会被组合在一起,NH将使用一级缓存来获取集合。

相关问题