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.";
}
}
}));
映射:
.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.";
}
}
}));