2016-12-28 3 views
4

У меня есть 2 таблицы, скажем T1 и T2. T1 содержит oID, cID, date, status и T2 содержит cID, cName, cURL. Я разработал класс для 2 выше таблиц, как показано ниже:AutoMapper для объединения записей из двух таблиц в единую IEnumerable viewmodel

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;} 

} 

cID в T1 является foreign key со ссылкой T2 - cID

N ой у меня есть модель T3 вид, как показано ниже, чтобы объединить T1 и T2

T3.cs

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

T3 распространяется T1 и T2 свойства определяются в T3. Таким образом, я собирался объединить 2 таблицы в одной модели с использованием AutoMapper. У меня есть метод получения всех деталей от 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 записей. Я не уверен, как я могу сопоставить данные из 2-х таблиц на основе их cID. Любая идея, как я могу это достичь?

+0

Нужно ли использовать поля из родительского (T1) в T3? – 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 .. :) –

 Смежные вопросы

  • Нет связанных вопросов^_^