gpt4 book ai didi

c# - LinqToSQL 递归选择

转载 作者:太空宇宙 更新时间:2023-11-03 14:51:41 24 4
gpt4 key购买 nike

在您将其标记为重复之前,我进行了广泛的搜索,但没有提供我的答案。我看过了 Recursive select via LINQ?linq to sql recursive queryhttp://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登录,那么他/她应该看到:EF和他/她自己(B )
  2. 如果 C 登录,那么他/她应该看到:D 和他/她自己 (C)
  3. 如果 D 登录,那么他/她应该看到:他/她自己 (D)
  4. 如果 E 登录,那么他/她应该看到:F 和他/她自己 (E)
  5. 如果 F 登录,那么他/她应该看到:他/她自己 (F)

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

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

有什么想法吗?

干杯

最佳答案

最好的解决方案可能是在 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 以仅返回这些列。

关于c# - LinqToSQL 递归选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51494960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com