Automapper-将复杂对象列表映射到属性列表

时间:2018-10-25 19:59:39

标签: c# automapper

我有以下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的属性 ORDERorder_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。

1 个答案:

答案 0 :(得分:0)

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

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

然后像您一样调用它(假设myDomainObjList<MyDominObj>):

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