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