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

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

我有一个包含多个字段的源类,其中 5 个字段可以为 null,但一次只能有 1 个字段不能为 null。 我想使用下面的逻辑映射到单个目标字段

NoteParent
。即我希望将
MapFrom
中的字符串放入目标
NoteParent
字段中。

使用 AutoMapper 可以吗?使用下面的映射,我已经能够使其中一个映射正常工作。基本上,只有第一条记录的第一个

src
值才会将该值放入与逻辑匹配的记录的
destination
中,但其他可能性的逻辑不起作用。

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");
    });
c# automapper
1个回答
2
投票

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

自定义值解析器

以按条件将多个属性映射到单个属性。 CreateMap<Note, NoteVM>() .ForMember(d => d.NoteParent, opt => opt.MapFrom((src, dest, destMember, ctx) => { if (src.Agent != null) return "Agent"; if (src.AssociatedFirm != null) return "AssociatedFirm"; if (src.Review != null) return "Review"; if (src.Schedule != null) return "Schedule"; return "Participant"; }) );

演示@.NET Fiddle

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