2015-04-25 27 views
1

我試圖在.NET 3.5中將嵌套對象變成DTO對象。大部分是我到目前爲止看到的是使用AutoMapper做到這一點(使用1.x版,因爲我需要使用.NET 3.5,不幸):使用AutoMapper Flatten嵌套列表

這裏是我的類結構的一個片段是這樣的:

public class RootObject 
{ 
    [JsonProperty("BaseSupplier")] 
    public BaseSupplier BaseSupplier { get; set; } 

    [JsonProperty("BaseOrderShipmentLineitem")] 
    public IList<BaseOrderShipmentLineitem> BaseOrderShipmentLineitem { get; set; } 
} 

public class BaseSupplier 
{ 
    [JsonProperty("id")] 
    public int Id { get; set; } 

    [JsonProperty("name")] 
    public string Name { get; set; } 
} 

public class BaseOrderShipmentLineitem 
{ 
    [JsonProperty("id")] 
    public int Id { get; set; } 

    [JsonProperty("qty_delivered")] 
    public int QtyDelivered { get; set; } 

    [JsonProperty("BaseOrderLineitem")] 
    public BaseOrderLineitem BaseOrderLineitem { get; set; }  
} 

public class BaseOrderLineitem 
{ 
    [JsonProperty("id")] 
    public int Id { get; set; } 

    [JsonProperty("product_sku")] 
    public string ProductSku { get; set; } 
} 

public class ShipmentDetailsDTO 
{ 
    public int BaseOrderShipmentLineitemId { get; set; } 
    public string BaseSupplierName { get; set; } 
    public string Sku { get; set; } 
} 

我一直是這樣的:

Mapper.CreateMap<BaseOrderLineitem, ShipmentDetailsDTO>() 
    .ForMember(d => d.Sku, opts => opts.MapFrom(s => s.ProductSku)); 
Mapper.CreateMap<BaseOrderShipmentLineitem, ShipmentDetailsDTO>(); 
Mapper.CreateMap<RootObject, ShipmentDetailsDTO>() 
    .ForMember(d => d.Sku, opts => opts.MapFrom(s => Mapper.Map<IEnumerable<BaseOrderLineitem>, IEnumerable<ShipmentDetailsDTO>>(s.BaseOrderShipmentLineitem.SelectMany(q => q.BaseOrderLineitem)).FirstOrDefault().Sku)) 
    ; 

var model = Mapper.Map<IEnumerable<RootObject>, IEnumerable<ShipmentDetailsDTO>>(obj); 

有了上面的代碼,我在此位s.BaseOrderShipmentLineitem.SelectMany(q => q.BaseOrderLineitem)得到一個錯誤:

Cannot implicitly convert type 'IEnumerable<?>' to 'IEnumerable<BaseOrderLineitem>'. An explicit conversion exists (are you missing a cast?) 

我不確定它是否簡單,我只是忽略了。

回答

2

更簡單的方法是使用一些LINQ編寫一個簡單的擴展方法來自己做這個投影。這是更簡單,更透明:

public static class MyConversionExtensions 
{ 
    public static IEnumerable<ShipmentDetailsDTO> ToShipmentDetails(this RootObject root) 
    { 
     return root.BaseOrderShipmentLineitem.Select(x => new ShipmentDetailsDTO() { 
      BaseOrderShipmentLineitemId = x.BaseOrderLineitem.Id, 
      BaseSupplierName = root.BaseSupplier.Name, 
      Sku = x.BaseOrderLineitem.ProductSku 
     }); 
    } 
} 

用法:

var shipmentDetails = myRootObject.ToShipmentDetails(); 
+0

感謝。我更新了這個問題。我的實際類對象非常冗長,所以只是試圖保持問題的簡潔性。 – jared

+0

@jared好了,更新以匹配您的問題編輯 – Alex