使用Automapper映射列表

时间:2011-04-08 01:27:40

标签: asp.net-mvc 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.

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

7 个答案:

答案 0 :(得分:70)

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

来自Getting Started

  

如何使用AutoMapper?

     

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

     

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

Mapper.CreateMap<Order, OrderDto>();
     

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

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

答案 1 :(得分:18)

另一种解决方案

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

在Automapper配置中

Mapper.CreateMap<Person, PersonViewModel>();

答案 2 :(得分: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>();

答案 3 :(得分:1)

在核心1.1中,此扩展可能有效:

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

答案 4 :(得分:0)

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

client.nodes.list(filters={'role': 'manager'})

用法:

public static class AutoMapperExtensions
{
    public static List<TDestination> MapList<TSource, TDestination>(this IMapper mapper, List<TSource> source)
    {
        return mapper.Map<List<TDestination>>(source);
    }
}

答案 5 :(得分:0)

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

答案 6 :(得分:0)

另一种解决方案

_createNewUserAsAdmin(email, password){
 var adminPass = SharedPreferences.adminPass;
 var adminEmail = SharedPreferences.adminEmail;

_auth.logout();

 var newUser= _auth.createUser(email, password);
 if(newUser == null){} //error creating user (user object is null), handle error and log back into admin
 else{
  _auth.logout()(
  _auth.signIn(adminEmail, adminPass);
 }
}