我有两个类别,一对一关系。需要将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
对象。
答案 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; }
}