C# Automapper-Don';当源对象具有具有值的属性时,t映射

C# Automapper-Don';当源对象具有具有值的属性时,t映射,c#,automapper,C#,Automapper,我们的实体有一个名为“DateDeleted”的字段。有时,我们可能会将它们加载到实体中,并希望在将它们发送到客户端之前将其过滤掉 我们的实体也有子实体,这些子实体有子实体,所有子实体都有一个DateDeleted 使用Automapper实现这一点的最佳实践是什么?具体来说,当源具有带有值的Date Deleted属性时,如何将空值映射到目标(整个对象)?配置映射时,可以忽略特定属性 CreateMap<srcType, destType>.ForMember(x => x.

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

我们的实体也有子实体,这些子实体有子实体,所有子实体都有一个DateDeleted


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

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

CreateMap<srcType, destType>.ForMember(x => x.DateDeleted, opt => opt.Ignore());
CreateMap.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>());
公共类NullCheckResolver:IValueResolver
{
公共TProp解析(TSrc源、TDest目标、TProp成员、解析上下文)
{
if(member.DateDeleted==null)
返回成员;
返回null;
}
}
CreateMap().FormMember(dest=>dest.MyOptionalProperty,opt=>opt.ResolveUsing());

有关自定义解析程序的更多详细信息,请参见

我不想忽略属性,我不想映射对象如果对象属性是某个值我明白你的意思,请稍等,我会更新我的回答为什么要使用automapper而不是在映射前过滤结果集?@DavidLibido 1。效率-如果您先过滤结果集,然后在集合上循环一次以过滤值,然后再进行映射,而使用此路由,您只在集合上循环一次。2.配置-如果您有许多不同的位置需要执行此映射(例如,在一组不同控制器上的模型和ViewModel之间),那么您可以在一个位置进行配置,并且它将应用于执行该映射的所有位置。尽管如此,AutoMapper还是有时间和地点的,它需要被证明是正当的。@RyanTernier道歉-我有一个打字错误。在我的示例中,解析器应该返回TProp。TProp应该是要有条件返回null的属性的对象类型