2012-05-10 10 views
3

エンティティのコレクションをDTOに投影しようとしています。単純なプロパティで簡単に十分な、しかし、コレクションで問題を抱えて:私は、単純な投影を得るように見えることはできませんNHibernate QueryOverの投影法 - コレクションをDTOに投影する

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>(); 

EDITのUPDATE

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), 
Projections.Property(() => blogAlias.Comments).WithAlias(() => myDTO.Comments) 
           .List<object>(); 
+0

これを変更してみてください:_session.QueryOver (()=> blogAlias) .JoinAlias(()=> blogAlias.Comments – Baz1nga

+0

明らかに別の質問をしたときに、これを複製として閉じたのはなぜですか?リンクされた問題は、QueryOverではなくCriteriaQueryを処理します。 –

+0

私はこの質問が重複していないことに同意します。返信のために – JoshBerke

答えて

5

私は、これはあなたが何をすべきかです推測しています。..

にあなたのDTOを更新します。

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

あなたの修正クエリ:そのdoesntの仕事であれば

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

関連する問題