Automapper:ForMember 中的复杂 if else 语句
Automapper: complex if else statement in ForMember
假设 Date
可以为 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;
}));
我得到的错误是:
Error 30 A lambda expression with a statement body cannot be converted
to an expression tree.
当然,我完全知道我可以简化查询,例如:
Mapper.CreateMap<SomeViewModels, SomeDTO>()
.ForMember(dest => dest.Date,
opt => opt.MapFrom(src => src.HasDate == "N" ? null : DateTime.Parse(src.Date.ToString())));
但是如果我坚持保留第一个例子的结构怎么办,因为我有更复杂的 if else 语句,第二个例子将无法满足,或者至少不是很可读?
使用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 中,ResolveUsing
已被删除。相反,使用 MapFrom 的新重载:
void MapFrom<TResult>(Func<TSource, TDestination, TResult> mappingFunction);
只需添加另一个 lambda/function 参数即可分派到这个新的重载:
CreateMap<TSource, TDest>()
.ForMember(dest => dest.SomeDestProp, opt => opt.MapFrom((src, dest) =>
{
TSomeDestProp destinationValue;
// mapping logic goes here
return destinationValue;
}));
假设 Date
可以为 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;
}));
我得到的错误是:
Error 30 A lambda expression with a statement body cannot be converted to an expression tree.
当然,我完全知道我可以简化查询,例如:
Mapper.CreateMap<SomeViewModels, SomeDTO>()
.ForMember(dest => dest.Date,
opt => opt.MapFrom(src => src.HasDate == "N" ? null : DateTime.Parse(src.Date.ToString())));
但是如果我坚持保留第一个例子的结构怎么办,因为我有更复杂的 if else 语句,第二个例子将无法满足,或者至少不是很可读?
使用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 中,ResolveUsing
已被删除。相反,使用 MapFrom 的新重载:
void MapFrom<TResult>(Func<TSource, TDestination, TResult> mappingFunction);
只需添加另一个 lambda/function 参数即可分派到这个新的重载:
CreateMap<TSource, TDest>()
.ForMember(dest => dest.SomeDestProp, opt => opt.MapFrom((src, dest) =>
{
TSomeDestProp destinationValue;
// mapping logic goes here
return destinationValue;
}));