2012-03-13 20 views
2

使用目標DTO帶有嵌套DTO爲Transformers.AliasToBean我有兩個DTO類這樣的:在NHibernate的

public class Mailing 
{ 
    public string MailingType {get;set;} 
    public DateTime? ValidUntil {get;set;} 
    public Address MailAddress {get;set;} 
} 

public class Address 
{ 
    public string Street {get;set;} 
    public string StreetNumber {get;set;} 
    public string ZIP {get;set;} 
} 

的根據實體simliar具有相同多到一個關係。

現在我想用一個查詢來讀取Mailing的列表,防止使用foreach手動構建DTO。類似這樣的:

return this.session.QueryOver<MailingEntity>() 
    .JoinAlias(p => p.Address,() => addressAlias) 
    .Where(...) 
    .SelectList(list => list 
     .Select(p => p.Type).WithAlias(() => mailingDTO.MailingType) 
     .Select(p => p.ValidTo).WithAlias(() => mailingDTO.ValidUntil) 
     .Select(() => addressAlias.Street).WithAlias(() => addressDTO.Street) 
     .Select(() => addressAlias.ZIP).WithAlias(() => addressDTO.ZIP) 
     .Select(() => addressAlias.StreetNumber).WithAlias(() => addressDTO.StreetNumber) 
     .Select(() => addressDTO).WithAlias(() => mailingDTO.MailAddress) 
    .TransformUsing(Transformers.AliasToBean<Mailing>()) 
    .List<Mailing>(); 

哪個不起作用。 有沒有辦法像這樣獲得嵌套的DTO,還是我必須分別使用幾個roudtrips手動創建DTO?

回答

1

如果LINQ是一個選項

var query = from e in session.Query<MailingEntity>() 
      let a = e.Address 
      select new Mailing 
      { 
       MailingType = e.Type, 
       ValidUntil = e.ValidTo, 
       MailAddress = new Address 
       { 
        Street = a.Street, 
        ZIP = a.ZIP, 
        StreetNumber = a.StreetNumber 
       } 
      }; 

return query.ToList(); 
+0

謝謝,好主意。我會測試它並給出反饋... – 2012-03-13 17:11:19

+1

@Andreas H.反饋未找到 – kerzek 2013-05-22 13:53:04

+0

我已經成功地使用了這種方法,但是,當我在子選擇內進行子選擇時有問題,即父>子集合>子採集。 查詢第三級時,我得到一個異常:「代碼應該是不可達的」 – 2016-03-31 08:14:08