2017-01-30 5 views
0

私はPITAレガシーDBモデルを持っています。ここでは、関連する部分があるAutoMapperで条件付きで2つのソースから目的地にマップする方法

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を出さず、アドレスにアクセスするたびにDBに移動します。ムッソは悲しい!

答えて

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)); 
関連する問題