Automapper:ForMember中的复杂if else语句

Sum*_* NL 13 c# automapper

假设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;

                        }));
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:"错误30带有语句体的lambda表达式无法转换为表达式树."

当然,我完全清楚我可以简化查询,例如:

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

但是,如果我坚持保留第一个例子的结构,因为我有更复杂的if else语句,第二个例子无法满足或至少不具有可读性,该怎么办?

Ron*_*rby 37

在 AutoMapper 的最新版本中,ResolveUsing已删除。相反,使用 MapFrom 的新重载:

void MapFrom<TResult>(Func<TSource, TDestination, TResult> mappingFunction);
Run Code Online (Sandbox Code Playgroud)

只需添加另一个 lambda/function 参数就会调度到这个新的重载:

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

                    // mapping logic goes here

                    return destinationValue;
                }));
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,自从 ResolveUsing 被删除后这很有帮助! (7认同)
  • 这是完美的谢谢。我不知道为什么所有这些例子在 AutoMapper 官方网站上都没有或很难找到。 (2认同)
  • 不客气,大家。在大多数情况下,我建议删除 AutoMapper 并编写手写映射代码,或者更好地找到一种方法来避免首先复制值。 (2认同)

Bac*_*cks 22

使用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;
}
Run Code Online (Sandbox Code Playgroud)

以下是更多信息:AutoMapper:MapFrom与ResolveUsing