2017-01-30 77 views
0

我有一個PITA遺留數據庫模型。下面是相關部分如何在AutoMapper中有條件地從兩個源映射到目標

class SalesOrder 
{ 
    public Recipient OrderBy {get;set;} 
    public Recipient BillTo {get;set;} 
    public List<SalesOrderLine> Lines {get;set;} 
} 

class SalesOrderLine 
{ 
public Recipient ShipTo {get;set;} 
public Address ShipToAddress {get;set;} 
} 

class Recipient 
{ 
    public Address DefaultAddress {get;set;} 
} 

Now comes the fun part. 

class RecipientDTO { 
public string Name {get;set;} 
public string Address1 {get;set;} 
public string Address2 {get;set;} 
... 
} 

我有一個需要是這樣

new OrderDTO { 
     OrderBy = new RecipientDTO { 
     Name = OrderBy.Name, 
     Address1 = OrderBy.DefaultAddress.Addr1, 
     .... 
} 
     BillTo = new RecipientDTO { 
     Name = BillTo.Name, 
     Address1 = BilLTo.DefaultAddress.Addr1, 
     .... 
} 

    Lines = Lines.Select (l => new SalesOrderLineDTO { 
       ShipTo = new RecipientDTO { 
     Name = ShipTo.Name, 
     Address1 = l.ShipToAddress.Addr1, //NOTE. THIS IS NOT USING DEFAULT ADDRESS 
     .... 
} 
    }) 
    } 

我怎樣寫在自動映射映射配置是爲了確保投影發出的選擇列OrderDTO 。如果我使用CustomResolver,則投影不會發出sql,並且每次訪問該地址時都會轉到數據庫。穆喬傷心!

回答

0

對任何有興趣的人,我有一個反向收件人地址。所以我能夠做到這一點以下

   m.CreateMap<SalesOrder, OrderDTO>() 
        .ForMember(d => d.OrderBy, conf => conf.MapFrom(o => o.OrderBy.DefaultAddress)) 
        .ForMember(d => d.BillTo, conf => conf.MapFrom(o => o.BillTo.DefaultAddress)); 
       m.CreateMap<Address, RecipientDTO>() 
        .ForMember(r => r.CustomerRecipientId, conf => conf.MapFrom(ra => ra.Recipient.CustRecipId)) 
        .ForMember(r => r.Address1, conf => conf.MapFrom(ra => ra.Addr1)) 
        .ForMember(r => r.Address2, conf => conf.MapFrom(ra => ra.Addr2)) 
.... 
       m.CreateMap<SalesOrderLine, OrderLineDTO>() 
        .ForMember(l => l.OrderQuantity, conf => conf.MapFrom(l => l.OrderQty ?? 0)) 
        .ForMember(l => l.ShipTo, conf => conf.MapFrom(z => z.ShipToAddress)); 
相關問題