2017-10-23 12 views
1

オートマトンを使用してオブジェクトのコレクションをコンクリートタイプの単一のオブジェクトにマップするにはどうすればよいですか?Automapper Map ICollection <T>を単一のコンクリートオブジェクトに変換する

サンプル:

モデル:

public class SystemOptionsModel 
{ 
    public string OptionID { get; set; } 
    public string OptionValue { get; set; } 
} 

DTO:

public class SystemOptionsDto 
{ 
    public Deliverymode? Deliverymode { get; set; } 
} 

私は、次のマッピング設定で1 SystemOptionsDtoにSystemOptionsModelのICollectionををマッピングしてみました:

CreateMap<SystemOptionsModel, SystemOptionsDto>() 
      .ForMember(dest => dest.Deliverymode, o => 
      { 

       o.Condition((src) => { return src.OptionID.Trim().ToLower().Equals("someString"); }); 
       o.MapFrom(srs => (Deliverymode)Enum.Parse(typeof(Deliverymode), srs.OptionValue.Trim())); 
      }); 

結果として、ソースコレクション内の各Itemに対して1つのItemを持つDTOのリストを取得しました。

CreateMap<SystemOptionsModel, SystemOptionsDto>() 
      .ForMember(dest => dest.Deliverymode, o => 
      { 
       o.MapFrom(src => src.OptionID.Trim().ToLower().Equals("someString") ? (Deliverymode?)Enum.Parse(typeof(Deliverymode), src.OptionValue.Trim()) : null); 
      }); 

結果もSystemOptionsDtoの一覧ではなく、単一のSystemOptionsDtoです:

は私もこれを試してみました。

+0

この 'src.OptionID.Trim()TOLOWER()に等しい( "someString")は'常に偽となります。 ;) –

+0

もちろん、監督:)... – macostobu

答えて

0

説明から、コレクションにoptionIDが "someValue"に等しい複数のアイテムが含まれている場合、値の変換方法が明確になりません。多分それは不可能です。 ソリューションは以下のとおりです。。

cfg.CreateMap<ICollection<SystemOptionsModel>, SystemOptionsDto>() 
    .ForMember(dest => dest.Deliverymode, opt => opt.ResolveUsing(
     src => src.Where(i => i.OptionID.Trim().ToLower() == "someString") 
        .Select(option => (Deliverymode?)Enum.Parse(typeof(Deliverymode), option.OptionValue.Trim())) 
        .FirstOrDefault())); 
+0

ありがとう、これは私のために働く! – macostobu

関連する問題