【问题标题】:Automapper - map list of complex object to list of propertiesAutomapper - 将复杂对象列表映射到属性列表
【发布时间】:2019-03-30 12:47:26
【问题描述】:

我有以下 DomainObject 类:

public class MyDomainObj
{
   public CUSTOMER customer {get;set;} // This is database entity
   public ORDER order {get;set;}
}

我的 DTO 如下所示:

public class MyDTO
{
   public string custId{get;set;}
   public strinf orderId{get;set;}
}

假设在CUSTOMER 表中我有一个名称为:customer_id 的属性 ORDER 表与order_id 相同

这是我的自动映射器配置:

m.CreateMap<CUSTOMER, MyDTO>().ForMember(d => d.custId, o => o.MapFrom(s => s.customer_id));
m.CreateMap<ORDER, MyDTO>().ForMember(d => d.orderId, o => o.MapFrom(s => s.order_id));

为了工作,我为mapper写了一个扩展方法:

public static class ExtensionAutoMapper
{
    public static TDestination Map<TSource, TDestination>(this TDestination destination, TSource source)
    {
        return Mapper.Map(source, destination);
    }
}

用法是:

var response = Mapper.Map<MyDTO>(myDomainObj.customer)
                .Map(myDomainObj.order);

这很好用。

问题:

  • 如何更改映射配置以将域对象列表映射到 dto 列表?

类似的东西

var response = Mapper.Map<List<MyDomainObj>, List<MyDTO>>(myDomainObj);

编辑: 如果它们具有相同的名称,我想自动将数据库实体中的字段映射到 dto 属性。

@jmoerdyk 提供的答案,解决我的问题。但是,在这种方法中,我必须将数据库实体的所有字段都映射到 dto,即使它们具有相同的名称。

【问题讨论】:

  • 如果名称匹配,您可以使用this扩展名进行展平。

标签: c# automapper


【解决方案1】:

您只需提供从MyDomainObj 到MyDto 的映射,它应该能够处理集合的映射:

Mapper.CreateMap<MyDomainObj,MyDTO>()
    .ForMember(d => d.custId, o => o.MapFrom(s => s.customer.customer_id))
    .ForMember(d => d.orderId, o => o.MapFrom(s => s.order.order_id));

然后像以前一样调用它(假设myDomainObj 是List&lt;MyDominObj&gt;):

var response = Mapper.Map<List<MyDomainObj>, List<MyDTO>>(myDomainObjList);

【讨论】:

  • 假设CUSTOMER 实体中还有一个名为timestamp 的列,而我的MyDTO 类也有一个同名的属性,我是否必须指定映射在你的答案中给出,或者它会自动被映射?
  • 您仍然需要对其进行映射,因为它的深度不同。如果您将 DTO 上的属性命名为使用约定,auto-flattening convention 可能会起作用,在您的情况下为CUSTOMERtimestamp。如果您的名称不符合约定,则必须明确提供映射。
猜你喜欢
  • 1970-01-01
  • 2012-10-16
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
相关资源
最近更新 更多