簡體   English   中英

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);
                })

預期結果:
如果滿足第一個條件,則不要覆蓋映射。

實際發生的情況:
第二個映射覆蓋了第一個映射。

我該如何解決這個問題?

它不起作用,因為您正在覆蓋先前為同一成員調用另一個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.";
            }
        }
    }));

這將是一個很酷的功能,但我在 Automapper 文檔中的任何地方都沒有看到它。

但是,如果邏輯不是更復雜,這應該適用於您的情況。

   .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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM