AutoMapper跳过源中所有为空的成员 [英] AutoMapper skip all members on source that are null

查看:59
本文介绍了AutoMapper跳过源中所有为空的成员的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

给出此映射

_mapper.Map(personDto, person, opt => opt.ConfigureMap()
    .ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null))
);

person 映射之前

FirstName: "John"
LastName: "Doe"
Email: "John.Doe@gmail.com"

personDto 映射之前

FirstName: "Jim"
LastName: "Denver"
Email: NULL

预期的输出 person

FirstName: "Jim"
LastName: "Denver"
Email: "John.Doe@gmail.com"

实际输出 person

FirstName: "Jim"
LastName: "Denver"
Email: NULL

映射器来自此帖子 https://stackoverflow.com/a/43947731/3511012

更新,我也尝试使用 ResolveUsing ,它具有相同的输出

Update, I also tried using ResolveUsing and it has the same output

_mapper.Map(personUpdateDto, person, opt => opt.ConfigureMap()
    .ForAllOtherMembers(opts => opts.ResolveUsing((src, dest, srcMember, dstMember) => srcMember ?? dstMember))
);


推荐答案

如果我理解正确,那么您有一个从 PersonDto Person 的预定义映射,并尝试对其进行配置在 Map 方法中进行映射.在这种情况下,下面的代码实际上并没有按您希望的那样工作,因为从未调用 ForAllMembers 中的lambda.

If I understand correctly then you have a predefined mapping from PersonDto to Person and trying to configure that mapping in the Map method. In that case, the code below really doesn't work as you want because the lambda in the ForAllMembers is never being called.

var config = new MapperConfiguration(cfg => cfg.CreateMap<PersonDto, Person>());//.ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null)));
var mapper = config.CreateMapper();
var person = new Person { FirstName = "John", LastName = "Snow" ,Email="test@mail.com"};
var personUpdateDto = new PersonDto { FirstName = "Jim", LastName = "Denver" };
var a = mapper.Map(personUpdateDto, person, opt => opt.ConfigureMap()
            .ForAllMembers(opts => opts.Condition((src, dest, srcMember) =>
            {
                return srcMember != null;
            }
            )));

但是下面的代码可以根据需要工作:

But the code below works as you want:

var config = new MapperConfiguration(cfg => cfg.CreateMap<PersonDto, Person>().ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null)));
var mapper = config.CreateMapper();
var person = new Person { FirstName = "John", LastName = "Snow", Email = "test@mail.com" };
var personUpdateDto = new PersonDto { FirstName = "Jim", LastName = "Denver" };
var a = mapper.Map(personUpdateDto, person);

使用内联映射的另一种方法是定义空的映射器配置,然后添加内联映射:

Another way to work with inline maps is to define empty mapper configuration and then add inline maps:

var config = new MapperConfiguration(cfg => { });
var mapper = config.CreateMapper();
var person = new Person { FirstName = "John", LastName = "Snow", Email = "test@mail.com" };
var personUpdateDto = new PersonDto { FirstName = "Jim", LastName = "Denver" };
var a = mapper.Map(personUpdateDto, person,opts=>opts.ConfigureMap()
.ForAllMembers(opts2 => opts2.Condition((src, dest, srcMember) =>
{
    return srcMember != null;
}
)));

这篇关于AutoMapper跳过源中所有为空的成员的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆