c# - 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将看到每个人的详细信息。
所以:
- 如果B登录,那么他/她应该看到:E , F和他/她自己 ( B )
- 如果C登录,那么他/她应该看到:D和他/她自己 ( C )
- 如果D登录,那么他/她应该看到:他/她自己 ( D )
- 如果E登录,那么他/她应该看到:F和他/她自己 ( E )
- 如果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 以返回只是那些列。
推荐阅读
- matlab - 使用 Matlab 内核的 Jupyter 中更大的内联图
- python - 通过 matlab 运行用 python 编写的子字符串实现抛出 typeError
- ios - *** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“试图弹出到不存在的视图控制器。”
- python - 硒脚本不在python中运行
- java - Java - 为什么 jpanel 的大小不起作用
- c# - 在 MVC 的引导框对话框中使用 Kendo Multi Select 下拉菜单时出错
- regex - 使用 perl 或 sed 获取子字符串
- php - 在数据库表的不同列上上传不同的文件
- facebook - 从 Facebook iframe 隐藏滚动条
- excel - 根据比较两行中的每个单元格来更改一行单元格的格式