web-dev-qa-db-fra.com

Mappage de listes à l'aide d'Automapper

J'ai les cours:

public class Person{ /* Props here */ }

public class PersonViewModel { /* Props here */ }

Puis la liste:

List<Person> people = new List<Person>();
List<PersonViewModel> peopleVM = Mapper
                                .MapList<Person, PersonViewModel>(people); //Problem here.

Quelle est la bonne façon de faire cela?

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

Depuis le Mise en route

Comment utiliser AutoMapper? Tout d’abord, vous avez besoin d’un type de source et d’un type de destination. La conception du type de destination peut être influencée par la couche dans laquelle il réside, mais AutoMapper fonctionne mieux tant que les noms des membres correspondent aux membres du type source. Si vous avez un membre source appelé "Prénom", il sera automatiquement associé à un membre de destination portant le nom "Prénom". AutoMapper prend également en charge l’atténuation, qui permet de supprimer toutes les exceptions de références nul que vous pourriez rencontrer en cours de route.

Une fois que vous avez vos types et une référence à AutoMapper, vous pouvez créer une carte pour les deux types.

Mapper.CreateMap<Order, OrderDto>();

Le type à gauche est le type de source et le type à droite est le type de destination. Pour effectuer un mappage, utilisez la méthode Map.

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

Une autre solution

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

Et dans la config Automapper

Mapper.CreateMap<Person, PersonViewModel>();
16
Rama

Si vous utilisez des listes IQueryable ici (à partir de EF ou de NH par exemple), vous pouvez utiliser les méthodes AutoMapper.IQueryableExtensions, Project () et To (). 

C'est la première fois que je travaille avec AutoMapper, mais j'y parviens en créant une carte uniquement pour le modèle:

Mapper.CreateMap<Person, PersonViewModel>();
Mapper.AssertConfigurationIsValid();

Et ensuite, en utilisant les méthodes IQueryableExtension Project () et To ():

using AutoMapper.QueryableExtensions;
...

IQueryable<Person> people = new List<Person>().AsQueryable(); //actually from ORM
IQueryable<PersonViewModel> peopleVM = people.Project().To<PersonViewModel>();
14
Jerph

Dans le noyau 1.1, cette extension pourrait fonctionner:

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

Vous pouvez créer une méthode d'extension pour faire quelque chose comme ceci en utilisant des mappages existants pour des éléments individuels:

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

Usage:

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