C# 当数据表不同时,如何使用linq填充复杂模型

C# 当数据表不同时,如何使用linq填充复杂模型,c#,linq,C#,Linq,当每个源的数据表不同时,如何用linq填充复杂模型,即。 1数据表返回员工,其他表返回部门和地址 Sample Model below: Public Class EmployeeData { Public Employee Emp {get;set;} } Public Class Employee { Public String EmployeeId {get;set;} Public String EmployeeName {get;set;} Public L

当每个源的数据表不同时,如何用linq填充复杂模型,即。 1数据表返回员工,其他表返回部门和地址

Sample Model below:

Public Class EmployeeData
{
  Public Employee Emp {get;set;}

}

Public Class Employee
{
   Public String EmployeeId {get;set;}
   Public String EmployeeName {get;set;}
   Public List<Department> Dep {get;set;}
}

Public Class Department
{
   Public String DepartmentId {get;set;}
   Public String DepartmentName {get;set;}
   Public List<Address> Addr {get;set;}
}

Public Class Address
{
   Public String AddrOne {get;set;}
   Public String City {get;set;}
}
示例模型如下:
公共类雇员数据
{
公共雇员Emp{get;set;}
}
公营雇员
{
公共字符串EmployeeId{get;set;}
公共字符串EmployeeName{get;set;}
公共列表Dep{get;set;}
}
公共课系
{
公共字符串DepartmentId{get;set;}
公共字符串DepartmentName{get;set;}
公共列表地址{get;set;}
}
公共课堂演讲
{
公共字符串地址{get;set;}
公共字符串City{get;set;}
}

假设datatable2的每个部门地址都有重复的部门ID行

var emps = dataTable1.AsEnumerable().Select(r => new {
  EmpId = r["EmpId"].ToString(),
  EmpName = r["EmpName"].ToString(),
});
var depts = dataTable2.AsEnumerable().Select(r => new {
  EmpId = r["EmpId"].ToString(),
  DepartmentId = r["DepartmentId"].ToString(),
  DepartmentName = r["DepartmentName"].ToString(),
  AddrOne = r["AddrOne"].ToString(),
  City = r["City"].ToString(),
});
emps
  .Select(e => new EmployeeData {
    Emp = new Employee {
      EmployeeId = e.EmpId,
      EmployeeName = e.EmpName,
      Dep = depts.Where(w => w.EmpId == e.EmpId).GroupBy(g => new {
        DepartmentId = g.DepartmentId,
        DepartmentName = g.DepartmentName,
      })
      .Select(d => new Department {
        DepartmentId = d.Key.DepartmentId,
        DepartmentName = d.Key.DepartmentName,
        Addr = d.Select(a => new Address {
          AddrOne = a.AddrOne,
          City = a.City
        }).ToList(),
      }).ToList(),
    },
  });
注:

  • 您需要添加对的引用 对于
    DatTable
    上的
    AsEnumerable()
    ,将返回
    IEnumerable
  • 我对数据表有点生疏,请相应调整

假设datatable2的每个部门地址都有重复的部门ID行

var emps = dataTable1.AsEnumerable().Select(r => new {
  EmpId = r["EmpId"].ToString(),
  EmpName = r["EmpName"].ToString(),
});
var depts = dataTable2.AsEnumerable().Select(r => new {
  EmpId = r["EmpId"].ToString(),
  DepartmentId = r["DepartmentId"].ToString(),
  DepartmentName = r["DepartmentName"].ToString(),
  AddrOne = r["AddrOne"].ToString(),
  City = r["City"].ToString(),
});
emps
  .Select(e => new EmployeeData {
    Emp = new Employee {
      EmployeeId = e.EmpId,
      EmployeeName = e.EmpName,
      Dep = depts.Where(w => w.EmpId == e.EmpId).GroupBy(g => new {
        DepartmentId = g.DepartmentId,
        DepartmentName = g.DepartmentName,
      })
      .Select(d => new Department {
        DepartmentId = d.Key.DepartmentId,
        DepartmentName = d.Key.DepartmentName,
        Addr = d.Select(a => new Address {
          AddrOne = a.AddrOne,
          City = a.City
        }).ToList(),
      }).ToList(),
    },
  });
注:

  • 您需要添加对的引用 对于
    DatTable
    上的
    AsEnumerable()
    ,将返回
    IEnumerable
  • 我对数据表有点生疏,请相应调整

您忘记添加datatables定义-您有哪些列?填充模型有什么问题吗?@SergeyBerezovskiy-第一个表有EmpId,EmpName,第二个表有EmpId,DepartmentId,DepartmentName,AddrOne,City。部门是1对多,地址是。员工人数是部门的1比多。这里需要3个表您忘了添加datatables定义-您有哪些列?填充模型有什么问题吗?@SergeyBerezovskiy-第一个表有EmpId,EmpName,第二个表有EmpId,DepartmentId,DepartmentName,AddrOne,City。部门是1对多,地址是。员工人数是部门的1比多。你需要三张桌子