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


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

653   5  

5 ответов:

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);

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

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

и в конфигурации Automapper

Mapper.CreateMap<Person, PersonViewModel>();

Если вы используете списки 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.1 это расширение может работать:

public static List<TDestination> MapList<TSource, TDestination>(this IMapper mapper, List<TSource> source)
        {
            return source.Select(x => mapper.Map<TDestination>(x)).ToList();
        }

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

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);

Comments

    Ничего не найдено.