web-dev-qa-db-ja.com

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.

これを行う正しい方法は何ですか?

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

はじめに から:

AutoMapperの使用方法

まず、使用するソースと宛先の両方のタイプが必要です。宛先タイプの設計は、それが存在するレイヤーの影響を受ける可能性がありますが、AutoMapperは、メンバーの名前がソースタイプのメンバーと一致する限り最適に機能します。 「FirstName」という名前のソースメンバーがある場合、これは「FirstName」という名前の宛先メンバーに自動的にマップされます。 AutoMapperは平坦化もサポートしています。これにより、途中で発生する可能性のある厄介なnull参照例外をすべて取り除くことができます。

タイプとAutoMapperへの参照を取得したら、2つのタイプのマップを作成できます。

Mapper.CreateMap<Order, OrderDto>();

左側のタイプはソースタイプであり、右側のタイプは宛先タイプです。マッピングを実行するには、Mapメソッドを使用します。

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

別の解決策

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

Automapper configで

Mapper.CreateMap<Person, PersonViewModel>();
18
Ram

ここで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>();
14
Jerph

コア1.1では、この拡張機能が機能する可能性があります。

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

個々のアイテムの既存のマッピングを使用して、次のような処理を行う拡張メソッドを作成できます。

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
garryp
  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);
  }
0
Diako Hasani