Подтвердить что ты не робот

Отображение списков с помощью 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.

Каков правильный способ сделать это?

4b9b3361

Ответ 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);
  }