首页 > 解决方案 > LinqToSQL 递归选择

问题描述

在您将其标记为重复之前,我进行了广泛的搜索,但没有提供我的答案。我已经 通过 LINQ 浏览了递归选择?linq to sql 递归查询http://www.scip.be/index.php?Page=ArticlesNET18#AsHierarchy

我需要的是第二个和第三个链接的反面。但我不知道该怎么做。

看这个例子:

EmployeeId  Name  ManagerId
----------------------------
    1        A     null
    2        B     1
    3        C     1
    4        D     3
    5        E     2
    6        F     5

我需要的是,如果A登录,A需要递归查看他/她的所有下属。在这种情况下,A将看到每个人的详细信息。

所以:

  1. 如果B登录,那么他/她应该看到:E , F和他/她自己 ( B )
  2. 如果C登录,那么他/她应该看到:D和他/她自己 ( C )
  3. 如果D登录,那么他/她应该看到:他/她自己 ( D )
  4. 如果E登录,那么他/她应该看到:F和他/她自己 ( E )
  5. 如果F登录,那么他/她应该看到:他/她自己 ( F )

我的问题是,如何创建递归的 linqtosql?

我目前的解决方案是将所有员工记录读取到列表中,然后进行递归检查。如果我有很多员工,将所有记录加载到列表中似乎是一种资源浪费。

任何想法?

干杯

标签: c#sqllinqlinq-to-sql

解决方案


最好的解决方案可能会在 Sql 中执行此操作。

如果无法修改 Sql 数据库,可以使用 ExecuteQuery 直接执行 Sql cte,例如类似

int employeeId = 1;

var query = this.ExecuteQuery<Employee>(
@" 
; WITH cte 
As
(   
    SELECT Employee.* FROM  Employee   WHERE EmployeeId = {0}

    UNION All SELECT so.* FROM Employee so INNER JOIN cte ON cte.EmployeeID = so.ManagerId
)

SELECT * FROM cte
", new object[] { employeeId } ); 

显然,您需要对此进行测试。

请注意,如果您执行类似操作,query.Select(a=> new { a.EmployeeID, a.Name})那么这仍将在后台执行 select * 并且其他列将被下载到客户端然后被忽略,但您可以创建一个包含所需字段的类并更改 cte 以返回只是那些列。


推荐阅读