C# 自动映射-目标上的条件映射

C# 自动映射-目标上的条件映射,c#,asp.net-core,.net-core,automapper,C#,Asp.net Core,.net Core,Automapper,映射: .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(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

三,

因此,在本例中,第一个条件映射表达式将被第二个条件映射表达式覆盖。要使其工作,请将条件映射连接到一个映射表达式中:

.ForMember(
dest=>dest.DisplayName,
opts=>opts.MapFrom((src,dest)=>
{
如果(src.Parent!=null)
{
返回string.Join(“,”,src.Name,src.Parent.Name);
}
其他的
{
如果(dest.DisplayName为空)
{
返回src.Name;
}
其他的
{
返回“未满足任何条件时的其他值。”;
}
}
}));

那么您要映射的内容同时满足这两个条件?您可以将您映射的项目添加到示例中吗?该示例不准确,因为我向目标添加了一个条件,我正在寻找一些现成的东西…我也在检查目标,请参见
如果(dest.DisplayName为null)
。此外,您在上述问题中没有提到您正在寻找“开箱即用”的解决方案。核心答案仍然有效-您不能为同一成员堆叠
FormMember()
方法。您能说明它是如何不准确的吗?根据您的问题,除了string.join位之外,这个答案看起来是正确的,它非常简单,可以修复。你能展示一下你尝试这个的结果吗?@reynoldsbj谢谢你的字符串。加入通知,添加了缺少的分隔符。我想可能有什么东西是现成的。。。