Automapper пустой список в пустой список - PullRequest
0 голосов
/ 12 марта 2020

У меня есть два следующих класса:

У меня есть два класса

 public class SourceClass
{
    public Guid Id { get; set; }
    public string Provider { get; set; }
}


public class DestinationClass
{
    public Guid Id { get; set; }
    public List<string> Providers { get; set; }
}

У меня есть следующие сопоставления для моего автомпера

CreateMap<SourceClass, DestinationClass>()
  .ForMember(destinationMember => destinationMember.Providers,
  memberOptions => memberOptions.MapFrom(src => new List<string> {src.Provider ?? ""}));

CreateMap<DestinationClass, SourceClass>().ForMember(SourceClass => SourceClass.Provider,
                memberOptions => memberOptions.MapFrom(src => src.Providers.FirstOrDefault()));

Я написал какой-то блок проверяет и может подтвердить следующее поведение:

Когда провайдеры в моем классе назначения имеют значение NULL, это сопоставляется с NULL, и это здорово. Тем не менее, я хотел бы изменить свое отображение так, чтобы, если Providers был пустым списком, он отображался в пустой список и, аналогично, если Provider был нулевым, я хотел бы, чтобы он отображался в пустой список вместо списка с пустая строка.

Кто-нибудь знает, как я могу go сделать это? Я пробовал это для моего преобразования из SourceClass в DestinationClass:

CreateMap<SourceClass, DestinationClass>()
      .ForMember(destinationMember => destinationMember.Providers,
memberOptions => memberOptions.MapFrom(src => !string.IsNullOrEmpty(src.Provider) ? new List<string> {src.Provider} : new List<string>()));

, но для перехода в другой путь, пустой список отображается на ноль, а не пустой список. (Я думаю из-за FirstOrDefault ()). Кто-нибудь знает, как я могу обойти это?

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

Протестировал это сопоставление с AutoMapper 6.1.1

var config = new MapperConfiguration(cfg =>
{
  cfg.CreateMap<SourceClass, DestinationClass>()
    .ForMember(dest => dest.Providers, 
    opt => opt.MapFrom(src => string.IsNullOrEmpty(src.Provider) ? new List<string>() 
                                                                 : new List<string> { src.Provider }));

    cfg.CreateMap<DestinationClass, SourceClass>()
      .ForMember(dest => dest.Provider, 
      opt => opt.MapFrom(src => src.Providers == null ? "" 
                                                      : src.Providers.FirstOrDefault() ?? ""));
});

Если вы действительно хотите, чтобы оно «встроено», оно работало. Я все еще думаю, что было бы легче читать, если бы вы переместили его в метод, который вы могли вызвать, или если бы вы могли обновить AutoMapper, чтобы использовать встроенное преобразование преобразования. Надеюсь, это даст вам достаточно информации для начала.

0 голосов
/ 12 марта 2020

Да. Я думаю, потому что его FirstOrDefaults () .. почему бы не использовать тот же троичный оператор или оператор if, чтобы поместить ваши условия для отображения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...