AutoMapper пропустить все элементы в источнике, которые являются нулевыми

2

учитывая это отображение

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

person перед картированием

FirstName: "John"
LastName: "Doe"
Email: "[email protected]"

personDto перед картированием

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

ожидаемый выходной person

FirstName: "Jim"
LastName: "Denver"
Email: "[email protected]"

фактический выходной person

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

mapper пришел из этого поста qaru.site/questions/631429/...


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

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

  • 0
    Это не отвечает на ваш вопрос, так как он должен быть настроен для каждого участника, но, возможно, это поможет. Как насчет использования оператора объединения нулей в конфигурации карты участника. .ForMember(dest => dest.Email, opt => opt.MapFrom((src, dest) => src.Email ?? dest.Email))
  • 0
    Я использую ForAllMembers поэтому он не может специально смотреть на Email . Я попробовал адаптировать вашу идею с помощью .ForAllMembers(opts => opts.ResolveUsing((src, dest, srcMember, dstMember) => srcMember ?? dstMember)) но это имело тот же эффект, что и Condition
Теги:
automapper

1 ответ

0

Если я правильно понимаю, то у вас есть предопределенное отображение от 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="[email protected]"};
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 = "[email protected]" };
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 = "[email protected]" };
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;
}
)));
  • 0
    Таким образом, передача ConfigureMap не переопределяет MapperConfiguration ?
  • 0
    @stackoverfloweth, кажется, так и есть.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню