使用LINQ实现C#方法:传入EmployeeId获取指定员工的所有下属
用LINQ实现递归查找员工所有下属的C#方法
需求背景
员工表中每个员工包含EmployeeId和SupervisorId字段,员工分为五级:普通员工、主管、经理、副总监、总监。其中总监的SupervisorId与自身EmployeeId相同(即自己为自己的上级)。需要实现一个方法,传入某个员工的EmployeeId,返回该员工的所有层级下属(包括直属下属、下属的下属,直到最底层普通员工)。
递归实现方案
基于你已获取的activeEmployeeList(在职员工列表),可以通过递归+LINQ的方式实现需求:
public List<Employee> GetAllSubordinates(int targetEmployeeId, List<Employee> activeEmployees) { // 筛选目标员工的直属下属,排除自身(避免总监被误算为自己的下属) var directSubordinates = activeEmployees .Where(e => e.SupervisorId == targetEmployeeId && e.EmployeeId != targetEmployeeId) .ToList(); // 递归获取每个直属下属的所有下属,合并所有层级结果 var allSubordinates = directSubordinates.Concat( directSubordinates.SelectMany(sub => GetAllSubordinates(sub.EmployeeId, activeEmployees)) ).ToList(); return allSubordinates; }
代码说明
- 第一步先筛选出目标员工的直属下属,通过
e.SupervisorId == targetEmployeeId匹配,同时加e.EmployeeId != targetEmployeeId排除总监自身(因为总监的SupervisorId等于自己)。 - 第二步通过
SelectMany递归调用方法,获取每个直属下属的所有下属,再用Concat把直属下属和间接下属合并成完整的下属列表。
迭代实现方案(避免栈溢出)
如果公司组织架构层级极深,递归可能引发栈溢出,此时可以用迭代+队列的方式实现:
public List<Employee> GetAllSubordinatesIterative(int targetEmployeeId, List<Employee> activeEmployees) { var allSubordinates = new List<Employee>(); var employeeQueue = new Queue<Employee>(); // 初始化队列,加入目标员工的直属下属 var directSubordinates = activeEmployees .Where(e => e.SupervisorId == targetEmployeeId && e.EmployeeId != targetEmployeeId) .ToList(); directSubordinates.ForEach(employeeQueue.Enqueue); while (employeeQueue.Count > 0) { var currentEmployee = employeeQueue.Dequeue(); allSubordinates.Add(currentEmployee); // 把当前员工的直属下属加入队列,继续遍历 var subordinates = activeEmployees.Where(e => e.SupervisorId == currentEmployee.EmployeeId).ToList(); subordinates.ForEach(employeeQueue.Enqueue); } return allSubordinates; }
关于你现有代码的说明
你提供的代码是用来筛选所有有下属的员工(即主管、经理、副总监、总监):
- 通过自连接
activeEmployeeList,将员工作为上级(e1)和下属(e2)关联,找出所有被其他员工设为上级的人员。 - 最后通过
Distinct去重,得到所有具备管理职责的员工列表。
内容的提问来源于stack exchange,提问作者user1778158
相关产品推荐
相关产品推荐

