将所有员工置于经理 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;
}

非常感谢所有的帮助!

将所有员工置于经理 C# 下

如果你只想要一个平面列表,那么这是简单的递归。 在伪代码中,它看起来像这样:

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
相关文章:
  • 没有找到相关文章