是否可以使用Automapper根据条件逻辑将不同的源字段映射到目的地?

问题描述 投票:0回答:1

我有一个包含多个字段的源类,其中 5 个字段可以为 null,但一次只能有 1 个字段不为 null。 我想使用如下逻辑映射到单个目标字段“NoteParent”。即我希望将 MapFrom 中的字符串放入目标 NoteParent 字段中。

使用 AutoMapper 可以吗?使用下面的映射,如果映射有效,我已经能够得到一个。基本上只有第一条记录的第一个 src 值才会将该值放置在与逻辑匹配的记录的目标中,但其他可能性的逻辑则不起作用。

  CreateMap<Note, NoteVM>()
        .ForMember(d => d.NoteParent, opt =>
          {
              opt.PreCondition(s => (s.Agent != null));
              opt.MapFrom(s => "Agent");
          })
        .ForMember(d => d.NoteParent, opt =>
        {
            opt.PreCondition(s => s.AssociatedFirm != null);
            opt.MapFrom(s => "Associated Firm");
        })
        .ForMember(d => d.NoteParent, opt =>
          {
              opt.PreCondition(s => (s.Review != null));
              opt.MapFrom(s => "Review");
          })
          .ForMember(d => d.NoteParent, opt =>
          {
              opt.PreCondition(s => s.Schedule != null);
              opt.MapFrom(s => "Schedule");
          })
          .ForMember(d => d.NoteParent, opt =>
          {
              opt.PreCondition(s => (s.Participant != null));
              opt.MapFrom(s => "Participant");
          });
automapper
1个回答
0
投票

据我怀疑,当您使用相同的目标成员定义多个映射规则时,行为是最后一个规则覆盖先前的规则,而不是链接(从第一个到最后一个)。

因此,您需要实现自定义值解析器来按条件将多个属性映射到单个属性。

CreateMap<Note, NoteVM>()
    .ForMember(d => d.NoteParent, opt => opt.MapFrom((src, dest, destMember, ctx) => 
    {
        if (src.Agent != null)
            return src.Agent;

        if (src.AssociatedFirm != null)
            return src.AssociatedFirm;

        if (src.Review != null)
            return src.Review;

        if (src.Schedule != null)
            return src.Schedule;

        return src.Participant;
    })
);

请注意,当前使用

opt.MapFrom(s => "Participant")
映射属性的方式,它将映射字符串值:“Participant”而不是成员值。

© www.soinside.com 2019 - 2024. All rights reserved.