我有2个表,比如T1
和T2
。 T1
包含 oID,cID,日期,状态,T2
包含 cID,cName,cURL 。我为以上两个表设计了类,如下所示:
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
中的{p> T1
是foreign key
引用T2 - cID
现在我的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
中定义。因此,我打算使用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 :(得分: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)
首先,您不需要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到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());