如何将两个班级之间的一对多关系转化

时间:2018-09-26 06:52:34

标签: c# .net list

我有两个类别,一对一关系。需要将DepartmentEmployees的对象转换为EmployeeDepartments

//Employee to Department (1-n) relation
public class DepartmentEmployeesEntity
{
    public DepartmentEntity Department { get; set; }

    public List<EmployeeEntity> Employees { get; set; }

}

//Employee to Department (1-n) relation
public class EmployeeDepartmentsEntity
{
    public EmployeeEntity Employee { get; set; }

    public List<DepartmentEntity> Departments { get; set; }   
}

public class University
{
    public List<DepartmentEmployeesEntity> DepartmentEmployees { get; set; }

    public List<EmployeeDepartmentsEntity> EmployeeDepartments { get; set; }   
}

DepartmentEmployees的数据以json格式存储在数据库中。如何将DepartmentEmployees对象转换为EmployeeDepartments对象。

2 个答案:

答案 0 :(得分:1)

在转换数据时,使用字典可以加快员工查找的速度。

var entitiesByEmployee = new Dictionary<Employee, EmployeeDepartmentsEntity>();

然后遍历您的数据并在字典中创建或更新EmployeeDepartmentsEntity条目。

var allDepartmentEmployeesEntities = dbContext.DepartmentEmployeesEntity.ToArray();
foreach (var departmentEmployee in allDepartmentEmployeesEntities) {
   foreach(var employee in departmentEmployee.Employees) {
      if (entitiesByEmployee.ContainsKey(employee)) {
          // this employee already showed up in another department, update his entry
          entitiesByEmployee[employee].Departments.Add(departmentEmployee.Department)
      }
      else {
          // this employee has not been processed yet, create new entry
          var newEntry = new EmployeeDepartmentsEntity {
              Employee = employee,
              Departments = new List<DepartmentEntity> {departmentEmployee.Department}
          };
          entitiesByEmployee.Add(employee, newEntry);
      }
   }
}

最后,您的结果是字典中的所有值:

List<EmployeeDepartmentsEntity> employeeDepartments = entitiesByEmployee.Values.ToList();

答案 1 :(得分:1)

任何解决方案都要求您拼合初始列表(dep->员工),然后按员工分组(emp->部门)。

使用linq,您可以按照以下两个步骤进行操作:

List<DepartmentEmployeesEntity> dep = new List<DepartmentEmployeesEntity>();
dep = PopulateData();
var step1 = dep.SelectMany(d => d.Employees, (d, e) => new { d.Department, employee = e});
List<EmployeeDepartmentsEntity> empDepList = step1.GroupBy(e => e.employee).Select(g => new EmployeeDepartmentsEntity () { Employee = g.Key, Departments = g.Select(x => x.Department).ToList() }).ToList();

我已将实体的定义更改为以下内容,即使用string类型,因为您使用的是自定义类型,请确保您覆盖Equals()GetHashCode()方法为您的课程

public class DepartmentEmployeesEntity
{
    public string Department { get; set; }
    public List<string> Employees { get; set; }
}