Отображение списков с помощью Automapper
У меня есть классы:
public class Person{ /* Props here */ }
public class PersonViewModel { /* Props here */ }
Затем список:
List<Person> people = new List<Person>();
List<PersonViewModel> peopleVM = Mapper
.MapList<Person, PersonViewModel>(people); //Problem here.
Каков правильный способ сделать это?
Ответы
Ответ 1
Mapper.CreateMap<Person, PersonViewModel>();
peopleVM = Mapper.Map<List<Person>, List<PersonViewModel>>(people);
Mapper.AssertConfigurationIsValid();
С начала работы:
Как я могу использовать AutoMapper?
Во-первых, вам нужен как исходный, так и целевой тип для работы. На дизайн типа назначения может влиять слой, в котором он живет, но AutoMapper работает лучше всего, если имена элементов совпадают с элементами исходного типа. Если у вас есть исходный элемент с именем "FirstName", он будет автоматически сопоставлен с целевым членом с именем "FirstName". AutoMapper также поддерживает выравнивание, которое может избавить от всех тех надоедливых исключений нулевых ссылок, с которыми вы можете столкнуться на этом пути.
Когда у вас есть свои типы и ссылка на AutoMapper, вы можете создать карту для двух типов.
Mapper.CreateMap<Order, OrderDto>();
Тип слева - это тип источника, а тип справа - тип назначения. Чтобы выполнить сопоставление, используйте метод Map.
OrderDto dto = Mapper.Map<Order, OrderDto>(order);
Ответ 2
Другое решение
List<Person> people = new List<Person>();
List<PersonViewModel> peopelVM;
peopelVM = people.Select(Mapper.Map<Person, PersonViewModel>);
И в конфигурации Automapper
Mapper.CreateMap<Person, PersonViewModel>();
Ответ 3
Если вы используете списки IQueryable (например, из EF или NH), вы можете использовать методы AutoMapper.IQueryableExtensions, Project() и To().
Это мой первый раз с AutoMapper, но мне удалось создать карту только для модели:
Mapper.CreateMap<Person, PersonViewModel>();
Mapper.AssertConfigurationIsValid();
И затем используя методы IQueryableExtension Project() и To():
using AutoMapper.QueryableExtensions;
...
IQueryable<Person> people = new List<Person>().AsQueryable(); //actually from ORM
IQueryable<PersonViewModel> peopleVM = people.Project().To<PersonViewModel>();
Ответ 4
В ядре 1.1 это расширение может работать:
public static List<TDestination> MapList<TSource, TDestination>(this IMapper mapper, List<TSource> source)
{
return source.Select(x => mapper.Map<TDestination>(x)).ToList();
}
Ответ 5
Вы можете создать метод расширения, чтобы сделать что-то вроде этого, используя существующие сопоставления для отдельных элементов:
public static class AutoMapperExtensions
{
public static List<TDestination> MapList<TSource, TDestination>(this IMapper mapper, List<TSource> source)
{
return mapper.Map<List<TDestination>>(source);
}
}
Использование:
List<PersonViewModel> peopleVM = _mapper.MapList<PersonViewModel>(people);
Ответ 6
public IActionResault Index(List<User> users)
{
List<VM_User> vM_users=new List<VM_User>();
vM_users=mapper.Map(users,vM_users);
return view(vM_users);
}