我在MVC应用程序中的LINQ中有一个要求,即我需要在下拉列表中填充员工列表,以将MGR分配给员工,他们的下属不是从属于他或他的下属。为了使我的观点更加清楚下面是场景 -
Id MgrId
1
2 1
3
4 2
5
6 3
我尝试
empBO.GetAllEmpList().Where(s => s.Id != model.ID && s.MgrId != model.ID);
这仅适用于一个级别,从上面我选择Empid 1进行编辑以分配MGR时,下拉列表只能包含3,5和6的Empid可以使用linq完成任何建议/帮助。
您可以使用递归方法来查找给定员工的所有下属(注意,如果层次结构深度很大,则可以使用查询/堆栈实现而不是递归):
public static IEnumerable<Employee> GetSubordinates(
IEnumerable<Employee> employees, int employeeId)
{
foreach (var employee in employees)
{
if (employee.MgrId != employeeId)
continue;
yield return employee;
foreach (var subordinate in GetSubordinates(employees, employee.Id))
yield return subordinate;
}
}
获得可用员工将很简单:
var employees = GetAllEmpList();
var available = employees.Except(GetSubordinates(employees, selectedId));
此方法将返回具有IDS {2,4}的员工。然后致电枚举。除了那些直接或间接从属于选定的人以外,还将为您提供所有员工。