AutoMapper пропустить все элементы в источнике, которые являются нулевыми - PullRequest
0 голосов
/ 13 февраля 2019

с учетом этого сопоставления

_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

mapper пришел из этого поста https://stackoverflow.com/a/43947731/3511012


Обновление, я также пытался использовать ResolveUsing и он имееттот же вывод

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

1 Ответ

0 голосов
/ 14 февраля 2019

Если я правильно понимаю, у вас есть предопределенное отображение от PersonDto до Person и вы пытаетесь настроить это отображение в методе Map.В этом случае приведенный ниже код действительно не работает так, как вы хотите, потому что лямбда в ForAllMembers никогда не вызывается.

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

Но приведенный ниже код работает так, как вы хотите:

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

Другой способ работы с встроенными картами - определить пустую конфигурацию картографа, а затем добавить встроенные карты:

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;
}
)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...