AutoMapperでifって書きたいときどうするか
C#のWEB開発ではAutoMapperが欠かせないレベルでかなり重要なのですが、完全にマッピングするのはやっぱり難しかったりします。MapFromだと三項演算子しか書けなくて読みづらい場合も出てくるのでifでかける方法を探しましたらあったので、備忘録的に書き残しときます。
まず普通のMapFromで書く場合(下のリンク丸々引用)
Mapper.CreateMap<SomeViewModels, SomeDTO>() .ForMember(dest => dest.Date, opt => opt.MapFrom(src => src.HasDate == "N" ? null : DateTime.Parse(src.Date.ToString())));
この程度ならいいのですが、もうちょい複雑になると困ります。なのでifで書くときはResolveUsingを使います。
ResolveUsingの使い方
Mapper.CreateMap<SomeViewModels, SomeDTO>() .ForMember(dest => dest.Date, o => o.ResolveUsing(Converter)); private static object Converter(SomeViewModels value) { DateTime? finalDate = null; if (value.Date.HasDate == "N") { // so it should be null } else { finalDate = DateTime.Parse(value.Date.ToString()); } return finalDate; }
Funcを渡せるので非常にわかりやすくなりました。MapFromとResolveUsingだと若干違います。
void MapFrom<TSourceMember>(Expression<Func<TSource, TSourceMember>> sourceMember); void ResolveUsing<TResult>(Func<TSource, TResult> resolver);
ResolveUsingはExpressionがないですね。これだと完全マッピングの道に近づくからうれしい!(まぁ、AutoMapperで完全マッピングすると逆にカオスになりそうですが笑)