2011-07-12 66 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將使用一級緩存來獲取集合。

相關問題