Отображение списков с помощью Automapper - PullRequest
61 голосов
/ 08 апреля 2011

У меня есть классы:

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.

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

Ответы [ 6 ]

70 голосов
/ 08 апреля 2011
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);
18 голосов
/ 22 апреля 2015

Другое решение

List<Person> people = new List<Person>();
List<PersonViewModel> peopelVM;
peopelVM = people.Select(Mapper.Map<Person, PersonViewModel>);

А в конфиге Automapper

Mapper.CreateMap<Person, PersonViewModel>();
14 голосов
/ 24 сентября 2012

Если вы используете здесь списки 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>();
1 голос
/ 16 апреля 2018

В ядре 1.1 это расширение может работать:

public static List<TDestination> MapList<TSource, TDestination>(this IMapper mapper, List<TSource> source)
        {
            return source.Select(x => mapper.Map<TDestination>(x)).ToList();
        }
0 голосов
/ 20 июня 2019
  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);
  }
0 голосов
/ 21 апреля 2017

Вы можете создать метод расширения, чтобы сделать что-то подобное, используя существующие сопоставления для отдельных элементов:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...