linq to sql recursive query

后端 未结 4 462
感情败类
感情败类 2020-12-06 05:12
EmployeeId  Name  ManagerId
------------------------------
1           A     null
2           B     null
3           C     1
4           D     3
5           E     2
         


        
4条回答
  •  失恋的感觉
    2020-12-06 05:35

    I'm not sure if this is exactly what you want, but here is one recursive method that uses some linq that makes sure not to enter an infinite loop:

        public static IEnumerable GetTreeForEmployeeNumber(this IEnumerable source, int startingId) {
            var result = source.Where(x => x.EmployeeId == startingId).FirstOrDefault();
            if (result != null) {
                var resultAsE = new [] { result };
                if (!result.ManagerId.HasValue)
                    return resultAsE;
                return resultAsE.Union(source.Except(resultAsE).GetTreeForEmployeeNumber(result.ManagerId.Value));
            }
            return new Employee [] { };
        }
    

    If you have linqpad installed you can test this with the following script:

    void Main()
    {
        var lst = new [] {
            new Extensions.Employee{ EmployeeId = 1, Name = "A", ManagerId = null }, 
            new Extensions.Employee{ EmployeeId = 2, Name = "B", ManagerId = null }, 
            new Extensions.Employee{ EmployeeId = 3, Name = "C", ManagerId = 1 }, 
            new Extensions.Employee{ EmployeeId = 4, Name = "D", ManagerId = 3 }, 
            new Extensions.Employee{ EmployeeId = 5, Name = "E", ManagerId = 2 }
        };
    
        lst.GetTreeForEmployeeNumber(4).Dump();
    }
    
    public static class Extensions {
    
        public class Employee {
            public int EmployeeId { get; set; }
            public string Name { get; set; }
            public int? ManagerId { get; set; }
        }
    
        public static IEnumerable GetTreeForEmployeeNumber(this IEnumerable source, int startingId) {
            var result = source.Where(x => x.EmployeeId == startingId).FirstOrDefault();
            if (result != null) {
                var resultAsE = new [] { result };
                if (!result.ManagerId.HasValue)
                    return resultAsE;
                return resultAsE.Union(source.Except(resultAsE).GetTreeForEmployeeNumber(result.ManagerId.Value));
            }
            return new Employee [] { };
        }
    }
    

提交回复
热议问题