2012-05-10 64 views
3

我想將一個實體的集合投影到DTO中。用簡單的屬性很容易,但與收藏的一個問題:NHibernate的QueryOver預測 - 投影集合到DTO

public class Blog 
{ 
    public string Name {get;set;} 
    public IList<Comments> Comments {get;set;} 
    //... more properties 
} 
public class Comments 
{ 
    public Blog Blog {get;set;} 
    //... more properties 
} 
public class MyDTO 
{ 
    public string BlogName {get;set;} 
    public IList<Comments> {get;set;} 
} 

查詢會有點像:

var dto = _session.QueryOver<Blog>(() => blogAlias) 
          .JoinAlias(x => x.Comments,() => commentsAlias, JoinType.LeftOuterJoin) 
          .Select(
           Projections.Property(() => blogAlias.Reference).WithAlias(() => myDTO.Reference), 
           // what project here to project blogAlias.Comments into myDTO.Comments)) 
          .TransformUsing(Transformers.AliasToBean<MyDTO>() 
          .SingleOrDefault<MyDTO>(); 

編輯UPDATE

我似乎無法得到一個簡單的投影運行,即使沒有變換,並得到: 「索引超出陣列的界限」:

var dto = _session.QueryOver<Blog>(() => blogAlias) 
           .JoinAlias(x => x.Comments,() => commentsAlias, JoinType.LeftOuterJoin) 
           .Select(
            Projections.Property(() => blogAlias.Reference).WithAlias(() => myDTO.Reference), 
Projections.Property(() => blogAlias.Comments).WithAlias(() => myDTO.Comments) 
           .List<object>(); 
+0

嘗試changin此:_session.QueryOver ((=)=> blogAlias) .JoinAlias((=)=> blogAlias.Comments – Baz1nga

+0

爲什麼當它清楚地詢問另一個問題時,它是否作爲副本關閉?鏈接的問題涉及CriteriaQuery而不是QueryOver。 –

+0

我同意這個問題不是重複的。投票重新打開 – JoshBerke

回答

5

我猜這是你應該做的..

更新您的DTO到:

public class MyDTO 
{ 
    public string BlogName {get;set;} 
    public IList<Comments> Comments {get;set;} 
} 

你修改後的查詢:

var dto = _session.QueryOver<Blog>(() => blogAlias) 
      .JoinAlias(x => x.Comments,() => commentsAlias, JoinType.LeftOuterJoin) 
      .Select(Projections.Property(() => blogAlias.Reference).WithAlias(() => myDTO.Reference), 
        Projections.Property(() => blogAlias.Comments).WithAlias(() => myDTO.Comments), 
      .TransformUsing(Transformers.AliasToBean<MyDTO>() 
      .SingleOrDefault<MyDTO>() 

如果不工作,然後

_session.QueryOver<Blog>(() => blogAlias) 
       .JoinAlias(x => x.Comments,() => commentsAlias, JoinType.LeftOuterJoin) 
       .Select(Projections.Property(() => blogAlias.Reference), 
         Projections.Property(() => blogAlias.Comments)) 
       .SingleOrDefault<object[]>() 
       .Select(x=>new MyDTO {BlogName=(string)x[0],Comments=x[1].Select(y=>y.ToString()).ToList())}; 
+0

感謝您的答覆,但我得到「索引超出數組的範圍」時嘗試使用Projections.Property的集合 - 即使我離開轉換,只是做一個簡單的列表 Chev

+0

你之後做選擇? – Baz1nga

+0

不,請檢查更新編輯的問題 - 運行選擇然後列表()並得到該錯誤! – Chev