【问题标题】:Automapper - Don't map when a source object has a property with a valueAutomapper - 当源对象具有带值的属性时不映射
【发布时间】:2017-06-08 21:17:35
【问题描述】:

我们的实体有一个名为“DateDeleted”的字段。有时我们可能会将这些加载到实体中,并且我们希望在将它们发送给客户端之前将它们过滤掉。

我们的实体也有子实体,它们都有子实体,所有子实体都有一个 DateDeleted。

使用 Automapper 实现这一点的最佳实践是什么 - 具体来说 - 当源具有带值的 Date Deleted 属性时,如何将 Null 值映射到目标(对于整个对象)?

【问题讨论】:

    标签: c# automapper


    【解决方案1】:

    您可以在配置映射时忽略特定属性

    CreateMap<srcType, destType>.ForMember(x => x.DateDeleted, opt => opt.Ignore());
    

    编辑: 要在映射期间执行自定义条件逻辑,您需要实现自定义解析器:

    public class NullCheckResolver : IValueResolver<TSrc, TDest, TProp>
    {
        public TProp Resolve(TSrc source, TDest destination, TProp member, ResolutionContext context)
        {
            if (member.DateDeleted == null)
                return member;
            return null;
        }
    }
    
    CreateMap<TSrc, TDest>().ForMember(dest => dest.MyOptionalProperty, opt => opt.ResolveUsing<NullCheckResolver>());
    

    有关自定义解析器的更多详细信息,请参阅AutoMapper documentation

    【讨论】:

    • 我不想忽略属性,如果objects属性是某个值我不想映射对象
    • 我明白你在说什么,等一下我会更新我的答案
    • 为什么要使用自动映射器而不是在映射之前过滤结果集?
    • @DavidLibido 1. 效率 - 如果您事先过滤结果集,那么您将遍历集合一次以过滤值并再次进行映射,而使用此路由您只能遍历集合一次。 2. 配置——如果你有很多不同的地方需要执行这个映射(比如在一堆不同控制器上的模型和视图模型之间),那么你可以在一个位置配置它,它将适用于所有执行此映射的地方那个映射。话虽如此,AutoMapper 是有时间和地点的,它需要被证明是合理的。
    • @RyanTernier 道歉 - 我有一个错字。在我的示例中,解析器应返回 TProp。 TProp 应该是您想要有条件地返回 null 的属性的对象类型
    猜你喜欢
    • 2021-02-22
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 2019-06-23
    • 2019-12-06
    • 2018-06-18
    • 2017-04-07
    • 1970-01-01
    相关资源
    最近更新 更多