web-dev-qa-db-ja.com

Automapper:ForMemberの複雑なifelseステートメント

日付がNULL可能であると仮定するDateTime:

Mapper.CreateMap<SomeViewModels, SomeDTO>()               
             .ForMember(dest => dest.Date,
                        opt => opt.MapFrom(src =>
                        {
                            DateTime? finalDate = null;
                            if (src.HasDate == "N")
                            {
                                // so it should be null
                            }
                            else
                            {                                   
                                endResult = DateTime.Parse(src.Date.ToString());

                            }                               
                            return finalDate;

                        }));

私が得たエラーは次のとおりでした:「エラー30ステートメント本体を持つラムダ式を式ツリーに変換できません。」

もちろん、次のようなクエリを簡略化できることを十分に認識しています。

Mapper.CreateMap<SomeViewModels, SomeDTO>()
             .ForMember(dest => dest.Date,
                        opt => opt.MapFrom(src => src.HasDate == "N" ? null : DateTime.Parse(src.Date.ToString())));

しかし、最初の例の構造を保持することを主張した場合はどうなりますか?2番目の例では対応できない、または少なくともあまり読みにくいという他のステートメントが複雑になったためです。

13
Sum NL

使用 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;
}

詳細は次のとおりです。 AutoMapper:MapFrom vs. ResolveUsing

22
Backs

AutoMapperの最近のバージョンでは、ResolveUsingが削除されました。代わりに、MapFromの新しいオーバーロードを使用してください。

void MapFrom<TResult>(Func<TSource, TDestination, TResult> mappingFunction);

別のラムダ/関数パラメーターを追加するだけで、この新しいオーバーロードにディスパッチされます。

        CreateMap<TSource, TDest>()
                .ForMember(dest => dest.SomeDestProp, opt => opt.MapFrom((src, dest) =>
                {
                    TSomeDestProp destinationValue;

                    // mapping logic goes here

                    return destinationValue;
                }));
4
Ronnie Overby