использование string.Split () в выпуске AutoMapper - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть основное приложение ASP .Net.Я просто пытаюсь настроить мой AutoMapper для преобразования строки, разделенной запятой, в список строк в соответствии с этой конфигурацией:

configuration.CreateMap<Job, JobDto>()
                .ForMember(dto => dto.Keywords, options => options.MapFrom(entity => entity.Keywords.Split(',').ToList()))

По какой-то причине он не компилируется и выдает мне следующую ошибку:

Дерево выражений не может содержать вызов или вызов, который использует необязательный аргумент

Я не понимаю, почему я получаю эту ошибку.Я вполне уверен, что я делал это в других моих проектах раньше без такой ошибки.

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

У меня была такая же проблема.Я не знаю, если это проблема или нет.В любом случае, я нашел обходной путь.

 CreateMap<Category, GetCategoryRest>()
                .ForMember(dest => dest.Words, 
                    opt => opt.MapFrom(src => ToWordsList(src.Words)));

 private static List<string> ToWordsList(string words)
 {
   return string.IsNullOrWhiteSpace(words) ? new List<string>() : words.Split(",").ToList();
 }

Гарантируется, что AutoMapper всегда имеет List.Тем не менее, я в замешательстве.В моем Startup.cs я определяю, что AutoMapper допускает нулевые значения для списка.

Mapper.Initialize(cfg => {
 cfg.AllowNullCollections = true;
}

Category.Words - это string.GetCategoryRest.Words - это List<string>

Версия AutoMapper: 8.1.1, AutoMapper.Microsoft.DependencyInjection: 6.1.1

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

Это полностью верно.

Ошибка возникает из-за того, что создаваемое дерево выражений собирается содержать более сложную логику, например .Split(',').ToList(), которая не является доступным свойством или методом, отражается только на верхнем уровне.свойства объекта и методы поддерживаются (как в классе MemberInfo).

Цепочка свойств, глубокие вызовы (.obj1property.obj2property), методы расширения не поддерживаются деревьями выражений, как в этом вызове .ToList ().

Мое решение было таким:

// Execute a custom function to the source and/or destination types after member mapping
configuration.CreateMap<Job, JobDto>()
  .AfterMap((dto,jobDto)=>jobDto.Keywords = dto.Keywords.Split(',').ToList());
...