2016-09-28 145 views
0

試圖映射以下拼合嵌套列表Automapper

public class WorkPreferance 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public IEnumerable<Location> PreferedLocations { get; set; } 
} 

public class Location 
{ 
    public int LocationID { get; set; } 
    public string LocationName { get; set; } 
} 

到以下目標...

public class WorkingPreferenceViewModel 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int LocationID { get; set; } 
    public string LocationName { get; set; } 
} 

,但我不能換我的頭周圍應該是什麼映射減速.. 所以遠我有這個:

Mapper.Initialize(cfg => 
{ 
    cfg.CreateMap<Location, WorkingPreferenceViewModel>() 
     .ForMember(d => d.LocationID, o => o.MapFrom(s => s.LocationID)) 
     .ForMember(d => d.LocationName, o => o.MapFrom(s => s.Description)) 
     .ForAllOtherMembers(o => o.Ignore()); 

    cfg.CreateMap<WorkPreferance, WorkingPreferenceViewModel>() 
     .ForMember(d => d.LocationID, o => o.MapFrom(s => s.PreferedLocations)) 
     .ForMember(d => d.LocationName, o => o.MapFrom(s => s.PreferedLocations)) 
} 
+0

我很困惑。你不能將任何東西的集合映射到該事物的一個實例。除非你做某種聚合或從集合中獲取單個實例。當你映射'WorkPreference'時,'LocationID'和'LocationName'應該是什麼? – MarioDS

+0

你可以當你想扁平化..就像你在LINQ中使用SelectMany .. – Mortalus

+0

對每個位置條目的意義我想創建一個新的對象WorkingPreferanceViewModel ... – Mortalus

回答

0

恐怕AutoMapper不能這樣做。它可以將單個對象映射到單個對象,並將對象集合映射到對象集合。

你想要做的是將單個對象映射到另一個對象的集合。我想不出你將如何使用AutoMapper來實現這一點。

但是,我必須說,我不明白你爲什麼定義你的視圖模式。爲什麼要重複IdName這麼多次?你提出的結構以何種方式變得更容易處理?

我會做的是創建一個LocationViewModel,並有WorkingPreferenceViewModel包含一個IEnumerable<LocationViewModel>。這樣,您可以通過在對象和它們各自的視圖模型之間創建映射,使用AutoMapper輕鬆映射它。它會整齊地照顧這裏有一個收藏的事實。