[英]Automapper - conditional mapping on destination
Mapping:映射:
.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);
})
Expected result:预期结果:
If the first condition is met don't override the mapping.如果满足第一个条件,则不要覆盖映射。
What actually happens:实际发生的情况:
The second mapping is overriding the first mapping.第二个映射覆盖了第一个映射。
How can I solve this?我该如何解决这个问题?
It doesn't work because you are overwriting previous mapping expressions calling another ForMember()
for the same member, which is your case is DisplayName
.它不起作用,因为您正在覆盖先前为同一成员调用另一个
ForMember()
映射表达式,您的情况是DisplayName
。 Consider such case:考虑这样的情况:
.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"));
Which value will be mapped to DisplayName
?哪个值将映射到
DisplayName
?
3
3
So in your case, your first conditional mapping expression is overwriten by the second one.所以在你的情况下,你的第一个条件映射表达式被第二个覆盖。 To make it work, join the conditional mapping into one mapping expression:
要使其工作,请将条件映射加入一个映射表达式:
.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.";
}
}
}));
It would be a cool feature to have but I don't see it anywhere in Automapper documentation.这将是一个很酷的功能,但我在 Automapper 文档中的任何地方都没有看到它。
This should however work in your case if the logic is not more complex.但是,如果逻辑不是更复杂,这应该适用于您的情况。
.ForMember(dest => dest.DisplayName, opt =>
{
opt.MapFrom(src => src.Name + (location.Parent != null ? ", " + src.Parent.Name : null));
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.