【问题标题】:AutoMapper to join records from 2 tables into single IEnumerable viewmodelAutoMapper 将 2 个表中的记录连接到单个 IEnumerable 视图模型中
【发布时间】:2016-12-28 19:00:27
【问题描述】:

我有 2 张桌子,比如 T1T2T1 包含 oID,cID,date,statusT2 包含 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;}
}

T2.cs

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

}

T1 中的cIDforeign key,指的是T2 - cID

现在我的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 个表中的数据。知道如何实现这一目标吗?

【问题讨论】:

  • 是否需要在 T3 中使用父级 (T1) 的字段?
  • @MegaTron 是的。我需要显示来自T1 的数据及其来自T2 的相关数据,并将它们合并到T3

标签: c# automapper


【解决方案1】:

我想你可以试试这样的:

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

【讨论】:

  • 这正是我要找的东西.. :) 谢谢.. :)
  • 我必须补充一点,因为我使用的是 Automapper v4.0.4,所以我必须使用 Mapper.Initialize 而不是 var config=new MapperConfiguration
  • @GuruprasadRao:哦,对不起,这是真的。我这样做是因为我使用的是 v4.2.1
  • 请不要抱歉..我没有提到版本,所以可能是我的错误.. :) 快乐编码..
【解决方案2】:

首先这里不需要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());

【讨论】:

  • 感谢您抽出宝贵的时间,伙计。我想接受上面的答案.. :) 他有很好的方法.. +1.. :)
猜你喜欢
  • 2015-10-30
  • 2014-03-29
  • 1970-01-01
  • 2020-10-31
  • 2016-01-02
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
相关资源
最近更新 更多