使用自动映射器映射列表


68

我有课程:

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.

正确的方法是什么?

Answers:


87
Mapper.CreateMap<Person, PersonViewModel>();
peopleVM = Mapper.Map<List<Person>, List<PersonViewModel>>(people);
Mapper.AssertConfigurationIsValid();

入门

如何使用AutoMapper?

首先,您需要同时使用源类型和目标类型。目标类型的设计可能会受到其所在层的影响,但是只要成员名称与源类型的成员匹配,AutoMapper的效果最佳。如果您有一个名为“ FirstName”的源成员,它将自动映射到名称为“ FirstName”的目标成员。AutoMapper还支持Flattening,它可以消除您可能会遇到的所有讨厌的null引用异常。

一旦有了类型以及对AutoMapper的引用,就可以为这两种类型创建映射。

Mapper.CreateMap<Order, OrderDto>();

左侧的类型是源类型,右侧的类型是目标类型。要执行映射,请使用Map方法。

OrderDto dto = Mapper.Map<Order, OrderDto>(order);

3
我需要使用CreateMap吗?我一直在没有它的情况下使用automapper,它可以工作。
肖恩·麦克林

1
大概只要属性名称匹配即可,并且不需要转换任何内容。您可以使用创建地图,如果属性名称不匹配,或者要忽略性能等
德里克·比蒂

1
尝试添加创建地图。您也可以执行Mapper.AssertConfigurationIsValid();。创建之后。通常,您将所有创建的内容放入引导程序或启动函数中。AutoMapper还支持配置文件。
德里克·比蒂

1
有没有建立彼此双向映射的简短方法?Mapper.Map<List<Person>, List<PersonViewModel>>(person)Mapper.Map<List<PersonViewModel> ,List<Person>>(person)
doganak

1
@doganak Mapper.Map <List <Person>,List <PersonViewModel >>(person)
.ReverseMap

24

另一种解决方案

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

并在Automapper配置中

Mapper.CreateMap<Person, PersonViewModel>();

14

如果您在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>();

9
我觉得这个答案最有用/最优雅。但是,Project()现在已弃用,应将其替换为ProjectTo()
阿列克谢

2

在核心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

您可以使用单个项目的现有映射创建扩展方法来执行以下操作:

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

0

另一种解决方案

mapper.Map<IEnumerable<PersonViewModel>>(people);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.