2016-04-27 5 views
1

AutoMapperに関する質問。 私は構造式を使用してDTOにIQueryableを投影しようとしていますが、結果は常にそのフィールドにnullがあります。ConstructProjectionUsing - 何が間違っていますか?

public class BaseObject { } 
    public class DTO { public string Name { get; set; } } 

.... 

      // create map BaseObject-to-DTO 
      Mapper.CreateMap<BaseObject, DTO>() 
       .ConstructProjectionUsing(s => new DTO 
       { 
        Name = "This name will never appear in DTO" 
       }); 

      // create object array with one element 
      var objects = new [] { new BaseObject() }; 

      var result = objects.AsQueryable().ProjectTo<DTO>(); // here Name = null everywhere 

なぜ結果の名前がnullですか?

答えて

0

ConstructProjectionUsingはコンストラクタのみを受け入れます。 Automapper sourcesに深いある「なぜ」質問し

.ConstructProjectionUsing(s => new DTO("This name will never appear in DTO")) 

回答:それはで正常に動作します。

1

これは予期された動作です。 AutoMapperは「選択」投影を作成しようとしています。 AutoMapperない通常の送信元/宛先投影がLINQで次のようになります。

objects.AsQueryable().Select(bo => new DTO { Name = bo.Name }); 

私は、送信元/宛先メンバーを通過し、LINQでMemberInitExpressionとして知られているもの作り上げます。これは、構造式とメンバーの初期化、新しい+中かっこプロパティの割り当てです。

ConstructProjectionUsingは、メンバ初期化式の「新しい」部分だけを置換することです:bo => new DTO("I like turtles") { Name = bo.Name };であり、個々のメンバではありません。あなたが探しているものについては、実際にmergeの2つのメンバ初期化式(AutoMapperがソース/デスティネーションのプロパティからビルドするもの)と、あなたが設定に入れたものをマッチさせる必要があります。私の頭はそれを効果的にする方法を考えて痛いです。

これ以外の方法でやってみようとすると、おそらく設定の例外がスローされる可能性があります。そのためのGH問題を自由に開いてください!

関連する問題