将所有员工置于经理 C# 下
本文关键字: | 更新日期: 2023-09-27 17:57:03
我正在尝试在表格中列出经理下的所有员工。因此,经理可以转到网页并查看他/她下的每个人,包括所有层次结构。
员工包括以下内容:
public class Employee
{
int id {get; set;}
string FirstName {get; set;}
string LastName {get; set;}
int EmployeeNumber {get; set;}
int ManagerEmployeeNumber {get; set;}
}
目前,我只是得到一个经理直接下属,但我想向每个人展示经理。
例:
(FirstName: "Aaron", EmployeeNumber: 1, ManagerEmployeeNo: NULL)
(FirstName: "Jack", EmployeeNumber: 2, ManagerEmployeeNo: 1)
(FirstName: "Roger", EmployeeNumber: 3, ManagerEmployeeNo: 1)
(FirstName: "Nat", EmployeeNumber: 4, ManagerEmployeeNo: 2)
(FirstName: "Fred", EmployeeNumber: 4, ManagerEmployeeNo: 4)
这只是一个例子,管理者可以比这更深入。
这是我目前拥有的:
public List<Employee> GetManagedEmployees(Employee manager)
{
var managedEmployees =_employeeDb.Employees.Where(e => e.ManagerEmployeeNumber == manager.EmployeeNumber).ToList();
return managedEmployees.Any() == false ? null : managedEmployees;
}
非常感谢所有的帮助!
如果你只想要一个平面列表,那么这是简单的递归。 在伪代码中,它看起来像这样:
IList<Employee> GetEmployees(Employee manager)
{
var result = new List<Employee>();
var employees = _employeeDb.Employees
.Where(e => e.ManagerEmployeeNumber == manager.EmployeeNumber)
.ToList();
foreach (var employee in employees)
{
result.Add(employee);
result.AddRange(GetEmployees(employee));
}
return result;
}
当然,您可以采用性能更高的方法,但为了简单起见,如果您只想在树上递归,这将解决问题。 您可能希望添加一些数据问题检查,例如确保没有无限递归(如果两个员工设法相互报告......这听起来很奇怪,但奇怪的事情发生在大公司)。
如果你真的想要一些高性能的东西,你可以直接在SQL中使用Common Table Expressions进行递归。 我已经有一段时间没有使用它了,所以我手边没有一个例子。 但它是现代SQL Server实例的一个非常简洁的功能,它确实允许在查询中进行递归。
SQL数据库并不特别擅长表示层次结构(尽管有些数据库提供专有扩展,例如Oracle Hierarchial Query)。
您需要以递归方式加载层次结构的每个级别。 首先像现在一样获取即时报告。 对于每个即时报告,您将需要加载其报告,依此类推,直到没有人有其他报告。
您当前的代码结构是一个很好的起点。 您将递归地为每个下属调用 GetManagedEmployees(),并将该调用的结果合并到生成报告的经理的直接和间接报告列表中。
在我的头顶上(我还没有测试过性能),这就是我在SQL SERVER 2008或2012中的做法。
DECLARE @allReports TABLE (employeeId int, managerEmployeeId int null);
--Insert all the top-level managers first.
INSERT INTO @allReports(employeeId,employeeManagerId)
SELECT employeeNumber,managerEmployeeNumber from employees where managerEmployeeNumber is null;
WHILE EXISTS (SELECT EmployeeNumber,ManagerEmployeeNumber from employees where ManagerEmployeeNumber IS IN (SELECT employeeNumber from @allReports);
BEGIN
Insert into @allReports(employeeId,employeeManagerId)
select e.employeeNumber, e.EmployeeManagerNumber from employees e inner join @allReports a on e.EmployeeManagerNumber =a.employeeNumber
where e.managerEmployeeNumber IS NOT NULL
END