在編輯我的問題之前,我很抱歉我的英文不好。使用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翻譯代碼到單個查詢嗎?
謝謝!
感謝您的回答,我會嘗試各種方式。 –
*真的很棒,它會工作,我使用相同的... * –
我使用了DeepTransformer類,它工作正常!現在,我可以選擇一組字段,NHibernate只發送一個查詢,而不是n + 1查詢!謝謝! –