【问题标题】:Mapping Lists using Automapper使用 Automapper 映射列表
【发布时间】:2011-08-01 03:51:50
【问题描述】:

我有课:

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.

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

【问题讨论】:

    标签: asp.net-mvc automapper


    【解决方案1】:
    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);
    

    【讨论】:

    • 我需要使用 CreateMap 吗?我一直在使用没有它的 automapper,它可以工作。
    • 可能不是只要属性名称匹配并且它不需要转换任何东西。如果属性名称不匹配或者您想忽略属性等,您可以使用 create map。
    • 尝试添加创建地图。你也可以做 Mapper.AssertConfigurationIsValid();创建后。通常你把你所有的创建都放在引导程序或启动函数中。 AutoMapper 还支持配置文件。
    • 是否有任何简短的方法可以创建到彼此的两个方向的映射? Mapper.Map&lt;List&lt;Person&gt;, List&lt;PersonViewModel&gt;&gt;(person)Mapper.Map&lt;List&lt;PersonViewModel&gt; ,List&lt;Person&gt;&gt;(person)
    • @doganak Mapper.Map, List>(person).ReverseMap()
    【解决方案2】:

    另一种解决方案

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

    在 Automapper 配置中

    Mapper.CreateMap<Person, PersonViewModel>();
    

    【讨论】:

      【解决方案3】:

      如果您在此处使用 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>();
      

      【讨论】:

      • 我发现这个答案最有用/最优雅。但是,Project() 现在已弃用,应替换为 ProjectTo()
      【解决方案4】:

      在核心 1.1 中,这个扩展可能会起作用:

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

      【讨论】:

        【解决方案5】:

        另一种解决方案

        mapper.Map<IEnumerable<PersonViewModel>>(people);
        

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 2013-05-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-16
            相关资源
            最近更新 更多