我有一个包含多个字段的源类,其中 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");
});
据我怀疑,当您使用相同的目标成员定义多个映射规则时,行为是最后一个规则覆盖先前的规则,而不是链接(从第一个到最后一个)。
因此,您需要实现自定义值解析器来按条件将多个属性映射到单个属性。
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”而不是成员值。