2016-12-28 27 views
4

我有2個表,比如說T1T2T1包含oID,cID,日期,狀態T2包含cID,cName,cURL。我已經設計類上述2個表如下:AutoMapper將來自2個表的記錄加入單個IEnumerable視圖模型

T1.cs

public class T1{ 
    public int oID{get;set;} 
    public int cID{get;set;} 
    public DateTime date{get;set;} 
    public string status{get;set;} 
} 

T2.cs

public class T2{ 
    public int cID{get;set;} 
    public string cName{get;set;} 
    public string cURL{get;set;} 

} 

cIDT1foreign key參照T2 - cID

N嗷嗷我有如下我T3視圖模型T1T2

T3.cs

public class T3:T1 
{ 
    public int cID{get;set;} 
    public string cName{get;set;} 
    public string cURL{get;set;} 
} 

T3延伸T1T2屬性在T3定義相結合。因此,我打算使用AutoMapper在單個視圖模型中合併2個表格。我有以下方法從T1獲取所有詳細信息,並從T2獲取相關詳細信息,填寫時將返回IEnumerable T3

public IEnumerable<T3> GetAll() 
{ 
    var od = mycontext.t1repository.GetMany().ToList(); 
    var ck = myContext.t2repository.GetMany(x => od.All(y => y.cID == x.cID)).ToList(); 
    if (od.Any()) 
    { 
     Mapper.CreateMap<tblT1, T3>(); 
     Mapper.CreateMap<tblT2, T3>() 
        .ForMember(x=>x.cID, a => a.MapFrom(s => s.cID)) 
     var response = Mapper.Map<List<T1>, List<T3>>(od); 
     return response; 
    } 
    return null; 
} 

我通過this answer嘗試上面的代碼,但是這是單實例,我必須返回記錄IEnumerable。我不知道如何根據他們的cID實際映射來自2個表的數據。任何想法如何我可以實現這一目標?

+0

您是否需要在T3中使用父代(T1)的字段? – Marusyk

+0

@MegaTron是的,我做..我需要從'T1'和它的相關數據顯示來自'T2'的數據,並將它們合併到'T3'中。 –

回答

2

我想你可以嘗試這樣的事:

var config = new MapperConfiguration(cfg => 
{ 
    cfg.CreateMap<T1, T3>(); 
    cfg.CreateMap<T2, T3>(); 
}); 

var mapper = config.CreateMapper(); 

var od = new List<T1> { ... }; 
var ck = new List<T2> { ... }; 

var result = od.Join(ck, t => t.cID, t => t.cID, (t1, t2) => 
{ 
    var t3 = mapper.Map<T1, T3>(t1); 
    t3 = mapper.Map<T2, T3>(t2, t3); 

    return t3; 
}); 
+1

這就是我正在尋找的.. :)謝謝.. :) –

+1

@GuruprasadRao:不客氣。 –

+1

我必須補充說,自從使用** Automapper v4.0.4 **以來,我不得不'Mapper.Initialize'而不是'var config = new MapperConfiguration' –

1

首先,你不需要在這裏cID,因爲它會從基類T1繼承:

public class T3:T1 
{ 
    public int cID{get;set;} //need to remove 
    public string cName{get;set;} 
    public string cURL{get;set;} 
} 

然後創建一個映射T1到T3:

Mapper.CreateMap<T1, T3>() 
    .ForMember(dest => dest.cName, opt => opt.Ignore()) 
    .ForMember(dest => dest.cURL, opt => opt.Ignore()); 

之後,創建一個T2的地圖t o T3:

Mapper.CreateMap<T2>, T3>() 
    .ForMember(dest => dest.oID, opt => opt.Ignore()) 
    .ForMember(dest => dest.date, opt => opt.Ignore()) 
    .ForMember(dest => dest.status, opt => opt.Ignore()); 
+0

感謝您的時間哥們..我想與上面的答案.. :)好方法他有.. +1 .. :) –

相關問題