AutoMapper将来自2个表的记录联接到单个IEnumerable视图模型中

Gur*_*Rao 5 c# automapper

我有2张桌子,说T1T2T1包含oID,cID,日期,状态,T2包含cID,cName,cURL。我为上面的2个表设计了类,如下所示:

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;}
}
Run Code Online (Sandbox Code Playgroud)

T2.cs

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

}
Run Code Online (Sandbox Code Playgroud)

cIDT1foreign keyT2 - cID

现在,我有我的T3视图模型如下结合T1T2

T3.cs

public class T3:T1
{
   public int cID{get;set;}
   public string cName{get;set;}
   public string cURL{get;set;}
}
Run Code Online (Sandbox Code Playgroud)

T3扩展T1T2属性在中定义T3。因此,我打算使用将两个表合并到一个视图模型中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;
}
Run Code Online (Sandbox Code Playgroud)

我通过这个答案尝试了上面的代码,但这是针对单个实例的,我必须返回IEnumerable记录。我不确定如何实际基于2表映射数据cID。知道我该如何实现吗?

Art*_*aca 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;
});
Run Code Online (Sandbox Code Playgroud)