.net – Linq to Sql – 查找祖先的分层查询

给定一个EmployeeId,我如何构建一个
Linq to Sql查询来查找该员工的所有祖先?每个EmployeeId都有一个相关的SupervisorId(见下文).

例如,对EmployeeId 6(Frank Black)的祖先的查询应该返回Jane Doe,Bob Smith,Joe Bloggs和Head Honcho.

如有必要,我可以缓存所有员工的列表以提高绩效.

更新:

我已经创建了以下原始方法来完成任务.它遍历employee.Supervisor关系一直到根节点.但是,这将为每个员工发出一个数据库调用.任何人都有更简洁或更高效的方法?谢谢.

private List<Employee> GetAncestors(int EmployeeId)
{
    List<Employee> emps = new List<Employee>();
    using (L2STestDataContext dc = new L2STestDataContext())
    {
        Employee emp = dc.Employees.FirstOrDefault(p => p.EmployeeId == EmployeeId);
        if (emp != null)
        {
            while (emp.Supervisor != null)
            {
                emps.Add(emp.Supervisor);
                emp = emp.Supervisor;
            }
        }
    }
    return emps;
}

最佳答案 首先,欢迎您使用我的
LINQ Extension Methods project中的分层查询.我认为可能有助于简化您的代码.

这里的问题是,这将为层次结构中的每个节点创建一个数据库调用.在您的示例中,您将有5次往返数据库.

我将使用不同的路径并创建一个存储过程来为我执行此操作并返回整个Employee对象集.由于在返回对象之前断开对象(处理上下文),因此您只需从存储过程的结果集中创建新对象即可.

点赞