How to map IEnumerable to List using AutoMapper

I am trying to map IEnumerable to List. I'm not sure how to make it work. Here is what I have tried so far.

I get the error "Customization for members is only supported for individual top-level members in a type."

Source: IEnumerable<Source>
Target: List<Target>

AutoMapper.Mapper.Map(sourceIEnum, TargetList);

Mapper.CreateMap<IEnumerable<Source>, List<Target>>()
    .ForMember(f => f, mp => mp.MapFrom(
                                    mfrom => mfrom.Select(s => AutoMapper.Mapper.Map(s, new Target())
                                ).ToList())
              );

Mapper.CreateMap<Source, Target>()
    .ForMember(f => f.TargetPropertyA, mp => mp.MapFrom(mfrom => mfrom.FromA.Value))
    .ForMember(f => f.TargetPropertyB, mp => mp.MapFrom(mfrom => mfrom.FromB.Value))
    .ForMember(f => f.TargetPropertyC, mp => mp.MapFrom(mfrom => mfrom.FromC.Value))
    .ForMember(f => f.InnerObjectTarget, mp => mp.MapFrom(
                                    mfrom => mfrom.Select(s => AutoMapper.Mapper.Map(s, new InnerObjectTarget())
                                ).ToList())
              );    

Mapper.CreateMap<SourceInner, TargetInner>()
        .ForMember(f => f.TargetInnerPropA, m => m.MapFrom(source => source.InnerA))
        .ForMember(f => f.TargetInnerPropB, m => m.MapFrom(source => source.InnerB))
        .ForMember(f => f.TargetInnerPropC, m => m.MapFrom(source => source.InnerC));
+4
source share
2 answers

There are several ways to compare IEnumerable<Source>with IEnumerable<Target>. I will show the three most convenient.

As an example, as an AdventureWorks (2008R2) database, I defined three DTO classes:

class ProductModelDto
{
    public string Name { get; set; }
    public IEnumerable<ProductDto> Products { get; set; }
}

class ProductDto
{
    public string Name { get; set; }
    public string Number { get; set; }
    public IEnumerable<ProductReviewDto> ProductReviews { get; set; }
}

class ProductReviewDto
{
    public string ReviewerName { get; set; }
    public string Email { get; set; }
}

Here is the only mapping I defined:

Mapper.CreateMap<ProductModel, ProductModelDto>();
Mapper.CreateMap<Product, ProductDto>()
      .ForMember(dto => dto.Number, m => m.MapFrom(p => p.ProductNumber));
Mapper.CreateMap<ProductReview, ProductReviewDto>()
      .ForMember(dto => dto.Email, m => m.MapFrom(pr => pr.EmailAddress));

Just a request:

// A ProductModel having a Product with ProductReviews
var query = db.ProductModels.Where(pm => pm.ProductModelID == 64);

, , ProductModel IEnumerable<ProductModelDto> :

1. query.Select(Mapper.Map<ProductModelDto>)
2. Mapper.Map<List<ProductModelDto>>(query)
3. query.ProjectTo<ProductModelDto>() (Project().To<> prior to v. 4.1.0)

ToList(), IEnumerable List.

:

- HL Mountain Pedal
  - HL Mountain Pedal; PD-M562
    - David; david@graphicdesigninstitute.com
    - Jill; jill@margiestravel.com

, AutoMapper IEnumerable s. , . , , .

3 - . IQueryable , - IQueryable. , , SQL, , . , DTOs , . Linq-to SQL, , 3 ( 1 2).

+5

, IEnumerable<Source> List<Target>.

Automapper , (List, IEnumerable, Collection ..), . .

..

Mapper.CreateMap<IEnumerable<Source>, List<Target>>()
    .ForMember(f => f, mp => mp.MapFrom(
                                    mfrom => mfrom.Select(s => AutoMapper.Mapper.Map(s, new Target())
                                ).ToList())
              );
+2

Source: https://habr.com/ru/post/1535137/


All Articles