【问题标题】:Linq query for referal manager推荐经理的Linq查询
【发布时间】:2014-01-31 08:38:11
【问题描述】:

我在 MVC 应用程序中的 LINQ 中有一个要求,即我需要在下拉列表中填充employeeId 列表,以将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 进行编辑以分配经理时,下拉列表应仅包含 3,5 和 6 的 empid。我在 LINQ 方面没有太多专业知识,因此选择了这个可以使用 LINQ 完成任何建议/帮助将不胜感激。

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    您可以使用递归的方法找到给定员工的所有下属(注意,如果层次结构深度很大,您可以使用query/stack implementation而不是递归):

    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));
    

    此方法将返回 ID 为 { 2, 4 } 的员工。然后调用Enumerable.Except 将给你所有员工,除了那些直接或间接从属选定的员工。

    【讨论】:

    • 感谢 Sergey 的及时回复并感谢您的建议。我试过这个,但它与我预期的一样,即我期望除下属以外的所有员工的 empids,但在这种情况下,它会获取下属的 ID。
    • @Harry 不,它会获取那些不在下属中的人。可能你没有看到Except 部分答案
    • 非常感谢谢尔盖,我错过了。
    • Serg,虽然你说的完全正确,但我的 List 不仅仅是 Employee 类,它是一个由其他类对象(Dept、Finance 等)组成的视图模型,当我尝试这个时,它会返回所有.对此有任何建议。
    • @Harry 如果没有看到您的实际代码,很难判断出了什么问题。确保您将完全相同的员工集合传递给 except 和 GetSubordinates
    猜你喜欢
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 2014-12-24
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多