2015-04-15 27 views
1

在編輯我的問題之前,我很抱歉我的英文不好。使用NHibernate AliasToBean Transformer啓動n + 1查詢

我有兩個類:

public class News 
{ 
    public virtua int Id { get; set; } 
    public virtual string Title { get; set; } 
    public virtual string Content { get; set; }     
    public virtual LearningCenter LearningCenter { get; set; } 
} 

public class LearningCenter 
{ 
    public virtua int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Address { get; set; } 
    public virtual string ZipCode { get; set; } 
    public virtual string PhoneNumber { get; set; } 
    public virtual string Mail { get; set; } 
    public virtual string DDECode { get; set; } 
}  

我使用一個主代碼一樣得到的消息列表:

var query = Session 
       .QueryOver<News>() 
       .JoinAlias(x => x.Language,() => language, JoinType.LeftOuterJoin) 
       .JoinAlias(x => x.LearningCenter,() => learningCenter, JoinType.LeftOuterJoin) 
       .List<News>(); 

上面的代碼是從NHibernate的轉換到一個SQL查詢,看起來像「選擇...從新聞左加入學習中心哪裏...」

它工作正常。但我想選擇一組領域,所以我做類似的東西......(注新聞和newsDTO對象具有相同類型)

News news = null; 
LearningCenter learningCenter = null; 
Language language = null; 
News newsDTO = null; 

var query = Session 
       .QueryOver(() => news) 
       .JoinAlias(() => news.LearningCenter,() => learningCenter, JoinType.LeftOuterJoin) 
       .JoinAlias(() => news.Language,() => language, JoinType.LeftOuterJoin) 
       .SelectList(l => l 
       .Select(x => x.Id).WithAlias(() => newsDTO.Id) 
       .Select(x => x.LearningCenter).WithAlias(() => newsDTO.LearningCenter)) 
       .TransformUsing(Transformers.AliasToBean<News>()) 
       .List<News>(); 

但問題是NHibernate的翻譯上面N + 1個查詢的代碼看起來像......

「SELECT ... FROM新聞LEFT JOIN學習中心在哪裏......」
「SELECT ... FROM學習中心WHERE CenterId = 388」
「SELECT ... FROM學習中心WHERE CenterId = 389「
...

你知道我如何爲NHibernate翻譯代碼到單個查詢嗎?

謝謝!

回答

1

一般來說有兩種方法。

1)我們必須使用投影,並且項目顯式選擇所有屬性。然後我們必須採用一些更深層次的轉變Deep transformer here

2)我們可以使用批量抓取,這將在少數批次中加載所有相關關係。這將導致1 + 2(4)的查詢,以加載在分離(少數)的所有關係查詢

詳情有關推算:

有關批處理詳情擷取以下你可以檢查此:

+0

感謝您的回答,我會嘗試各種方式。 –

+0

*真的很棒,它會工作,我使用相同的... * –

+0

我使用了DeepTransformer類,它工作正常!現在,我可以選擇一組字段,NHibernate只發送一個查詢,而不是n + 1查詢!謝謝! –