首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LinqToSQL递归选择

LinqToSQL递归选择
EN

Stack Overflow用户
提问于 2018-07-24 09:19:22
回答 1查看 117关注 0票数 2

在你把它标记为复制之前,我做了大量的搜索,但它没有给出我的答案。我看过Recursive select via LINQ?linq to sql recursive queryhttp://www.scip.be/index.php?Page=ArticlesNET18#AsHierarchy

我需要的是反向的第二和第三环节。但我不知道该怎么做。

请看下面的示例:

代码语言:javascript
复制
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?

我的当前解决方案是将所有员工记录读入列表,然后执行递归检查。如果我有很多员工,这似乎是浪费资源来加载所有的记录来列出。

有什么想法吗?

干杯

EN

回答 1

Stack Overflow用户

发布于 2018-07-25 12:30:05

最好的解决方案可能是在Sql中这样做。

如果不能修改Sql数据库,可以使用ExecuteQuery直接执行Sql (如

代码语言:javascript
复制
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返回这些列。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51494960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档