日付が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番目の例では対応できない、または少なくともあまり読みにくいという他のステートメントが複雑になったためです。
使用 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
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;
}));