LINQ中SQL Server版本的Oracle CONNECT BY显示层次结构

我已经在SQL Server 2008中成功模拟了一个Oracle CONNECT BY语句,在这里和这里按照这两个前面的答案并调整以获得我需要的结果。 但是我如何在LINQ中执行此操作?

这是我使用虚拟数据库做的一个例子:

CREATE TABLE Employee( EmployeeID INT IDENTITY(1,1) PRIMARY KEY, Department INT NOT NULL, EmployeeName VARCHAR(40) NOT NULL, PeckingOrder INT NOT NULL, HigherDepartment INT NULL) INSERT INTO Employee (Department,EmployeeName,PeckingOrder,HigherDepartment) VALUES (1,'Bart',1,NULL),(2,'Homer',1,1),(2,'Marge',2,NULL), (3,'Lisa',1,2),(3,'Maggie',2,2),(3,'Santas Helper',3,1) EmployeeID Department EmployeeName PeckingOrder HigherDepartment 1 1 Bart 1 NULL 2 2 Homer 1 1 3 2 Marge 2 NULL 4 3 Lisa 1 2 5 3 Maggie 2 2 6 3 Santas Helper 3 1 

这是用于返回heirachy的SQL:

 WITH n(level, PeckingOrder, Department, EmployeeName, HigherDepartment) AS (SELECT 1, PeckingOrder, Department, EmployeeName, HigherDepartment FROM Test.dbo.Employee WHERE Department = 3 UNION ALL SELECT n.level + 1, nplus1.PeckingOrder, nplus1.Department, nplus1.EmployeeName, nplus1.HigherDepartment FROM Test.dbo.Employee as nplus1 JOIN n ON n.HigherDepartment = nplus1.Department) SELECT MAX(level) AS level, PeckingOrder, Department, EmployeeName, HigherDepartment FROM n GROUP BY PeckingOrder, Department, EmployeeName, HigherDepartment ORDER BY MAX(level) DESC, PeckingOrder ASC level PeckingOrder Department EmployeeName HigherDepartment 3 1 1 Bart NULL 2 1 2 Homer 1 2 2 2 Marge NULL 1 1 3 Lisa 2 1 2 3 Maggie 2 1 3 3 Santas Helper 1 

您可以使用ExecuteQuery

 class YourRow { public int level {get; set;} public int PeckingOrder {get; set;} ... } using (var db = new LinqDataContext()) { var list = db.ExecuteQuery( @" WITH n(level, PeckingOrder, Department, EmployeeName, HigherDepartment) AS (SELECT 1, PeckingOrder, Department, EmployeeName, HigherDepartment ... "; } 

或者更好,创建一个包含查询的视图,并使用LINQ从视图中读取。