使用Automapper映射列表

Sha*_*ean 65 asp.net-mvc automapper

我有课:

public class Person{ /* Props here */ }

public class PersonViewModel { /* Props here */ }
Run Code Online (Sandbox Code Playgroud)

然后是清单:

List<Person> people = new List<Person>();
List<PersonViewModel> peopleVM = Mapper
                                .MapList<Person, PersonViewModel>(people); //Problem here.
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是什么?

Der*_*tie 75

Mapper.CreateMap<Person, PersonViewModel>();
peopleVM = Mapper.Map<List<Person>, List<PersonViewModel>>(people);
Mapper.AssertConfigurationIsValid();
Run Code Online (Sandbox Code Playgroud)

入门

我如何使用AutoMapper?首先,您需要使用源和目标类型.目标类型的设计可能受其所在层的影响,但只要成员的名称与源类型的成员匹配,AutoMapper就能发挥最佳效果.如果您有一个名为"FirstName"的源成员,则会自动将其映射到名为"FirstName"的目标成员.AutoMapper还支持Flattening,它可以摆脱您在此过程中可能遇到的所有那些讨厌的空引用异常.

获得类型和AutoMapper参考后,您可以为这两种类型创建地图.

Mapper.CreateMap<Order, OrderDto>();
Run Code Online (Sandbox Code Playgroud)

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

OrderDto dto = Mapper.Map<Order, OrderDto>(order);
Run Code Online (Sandbox Code Playgroud)

  • 我需要使用CreateMap吗?我一直在使用没有它的automapper,它的工作原理. (3认同)
  • 谢谢,我从valueinjecter换了这个大声笑. (2认同)
  • @doganak Mapper.Map&lt;List&lt;Person&gt;, List&lt;PersonViewModel&gt;&gt;(person).ReverseMap() (2认同)

Ram*_*Ram 19

另一种方案

List<Person> people = new List<Person>();
List<PersonViewModel> peopelVM;
peopelVM = people.Select(Mapper.Map<Person, PersonViewModel>);
Run Code Online (Sandbox Code Playgroud)

并在Automapper配置中

Mapper.CreateMap<Person, PersonViewModel>();
Run Code Online (Sandbox Code Playgroud)


Jer*_*rph 14

如果您在此处使用IQueryable列表(例如,来自EF或NH),您可以使用AutoMapper.IQueryableExtensions方法,Project()和To().

这是我第一次使用AutoMapper,但我成功地为模型创建了一个地图:

Mapper.CreateMap<Person, PersonViewModel>();
Mapper.AssertConfigurationIsValid();
Run Code Online (Sandbox Code Playgroud)

然后使用IQueryableExtension方法Project()和To():

using AutoMapper.QueryableExtensions;
...

IQueryable<Person> people = new List<Person>().AsQueryable(); //actually from ORM
IQueryable<PersonViewModel> peopleVM = people.Project().To<PersonViewModel>();
Run Code Online (Sandbox Code Playgroud)

  • 我发现这个答案最有用/优雅.但是,`Project()`现在已被弃用,应该替换为`ProjectTo()`. (8认同)