c# - 如何使用 AutoMapper 将 IEnumerable 映射到列表

标签 c# automapper

我正在尝试将 IEnumerable 映射到列表。我不确定如何让它工作。到目前为止,这是我尝试过的方法。

我收到错误消息“成员的自定义配置仅支持某个类型的顶级个人成员。”

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

最佳答案

有几种方法可以映射 IEnumerable<Source>IEnumerable<Target> .我将展示三个最方便的。

AdventureWorks database (2008R2) 为例,我定义了三个DTO类:

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

这是我定义的唯一映射:

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

只是一个查询:

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

现在我认为最方便的方法是映射源ProductModel s 至 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() , 你映射了 IEnumerableList .

所有三种选择的输出都是相同的:

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

如您所见,AutoMapper 不需要 IEnumerable 的显式映射定义。秒。不适用于顶层,也不适用于嵌套集合。当源类和目标类中的名称相同并且为集合中的元素定义了映射时,它还会映射嵌套集合。

案例3是一个特例。它转换 IQueryable到目标,它仍然是一个 IQueryable .在映射之后应用的谓词仍被转换为 SQL,并且查询尝试仅从数据库中选择投影所需的字段。但是,当 DTO 嵌套时,后者并不总是成功,如本例所示。 Linq-to SQL 似乎使用选项 3 执行两个查询(但三个用于 1 和 2)。

关于c# - 如何使用 AutoMapper 将 IEnumerable 映射到列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22876251/

相关文章:

c# - 传递 USPS eVSCertifyRequest 错误,因为在数据库中找不到 MasterMID

c# - ***.tmp 不是有效的 win32 资源文件。如何解决 Visual Studio 上的这个奇怪错误?

c# - 可存储在 Excel 中的值

c# - 带有 CreateMissingTypeMaps 和 AddProfile 的 AutoMapper

dependency-injection - 具有 Multi-Tenancy 应用程序的自动映射器 - 我们如何为每个租户提供自定义映射规则?

c# - 为什么在断点处继续太快会使我的服务器发送无效响应

c# - 如何正确封装对具有(几乎)相同模式的不同数据库系统的访问?

automapper - 从 AutoMapper 开始

c# - Automapper项目使用

.net - 使用 AutoMapper 根据鉴别器值从不同属性进行映射