Automapper - 目的地的条件映射

Automapper - conditional mapping on destination

映射:

   .ForMember(dest => dest.DisplayName, opt =>
                {
                    opt.PreCondition(location => location.Parent != null);
                    opt.MapFrom(src => src.Name + ", " + src.Parent.Name);
                })
                .ForMember(dest => dest.DisplayName, opt =>
                {
                    opt.PreCondition((src, dest, context) => dest.DisplayName == null);
                    opt.MapFrom(src => src.Name);
                })

预期结果:
如果满足第一个条件,则不要覆盖映射。

实际发生了什么:
第二个映射覆盖第一个映射。

我该如何解决这个问题?

拥有这将是一个很酷的功能,但我在 Automapper 文档中没有看到它。

但是,如果逻辑不是更复杂,这应该适用于您的情况。

   .ForMember(dest => dest.DisplayName, opt =>
   {
       opt.MapFrom(src => src.Name + (location.Parent != null ? ", " + src.Parent.Name : null));
   })

它不起作用,因为您正在覆盖以前的映射表达式,为同一成员调用另一个 ForMember(),您的情况是 DisplayName。考虑这样的情况:

.ForMember(d => d.DisplayName, o => o.MapFrom(s => "1"))
.ForMember(d => d.DisplayName, o => o.MapFrom(s => "2"))
.ForMember(d => d.DisplayName, o => o.MapFrom(s => "3"));

哪个值将映射到 DisplayName

3

所以在你的情况下,你的第一个条件映射表达式被第二个覆盖。要使其工作,请将条件映射加入一个映射表达式:

.ForMember(
    dest => dest.DisplayName,
    opts => opts.MapFrom((src, dest) =>
    {
        if (src.Parent != null)
        {
            return string.Join(", ", src.Name, src.Parent.Name);
        }
        else
        {
            if (dest.DisplayName is null)
            {
                return src.Name;
            }
            else
            {
                return "Some other value when no conditions were met.";
            }
        }
    }));