LINQ TO SQL 实现无限递归查询

from:http://blog.csdn.net/q107770540/article/list

见论坛内有网友提问类似的问题已经不止一次了,

现总结一下,希望能给以后再碰到此类问题的朋友一些帮助 

[sql] view plain copy
 
  1. --构造测试数据: 只作演示用  
  2. CREATE TABLE [dbo].[Tim_LinqTable](  
  3. [Id] int PRIMARY KEY IDENTITY(1,1) NOT NULL,  
  4. [Name] [varchar](50) NOT NULL,  
  5. [Parent] int NOT NULL,  
  6. )  
  7. GO  
  8.   
  9. INSERT INTO [Tim_LinqTable]    
  10. SELECT 'A',0 UNION ALL  
  11. SELECT 'A1',1 UNION ALL  
  12. SELECT 'A2',1 UNION ALL  
  13. SELECT 'B1',2 UNION ALL  
  14. SELECT 'B2',3 UNION ALL  
  15. SELECT 'C1',4 UNION ALL  
  16. SELECT 'C2',4 UNION ALL  
  17. SELECT 'D1',5 UNION ALL  
  18. SELECT 'D2',5 UNION ALL  
  19. SELECT 'D3',5   
  20. GO  
  21.   
  22. WITH temp  
  23. AS  
  24. (  
  25. SELECT * FROM [Tim_LinqTable]  WHERE Parent = 3  
  26. UNION ALL  
  27. SELECT m.* FROM [Tim_LinqTable]  AS m  
  28. INNER JOIN temp AS child ON m.Parent = child.Id  
  29. )  
  30. SELECT * FROM temp  
  31. GO  
  32.   
  33. --查询 Parent=3 的所有子数据结果如下:  
  34. Id          Name                                               Parent  
  35. ----------- -------------------------------------------------- -----------  
  36. 5           B2                                                 3  
  37. 8           D1                                                 5  
  38. 9           D2                                                 5  
  39. 10          D3                                                 5  
  40.   
  41. (4 row(s) affected)  
[csharp] view plain copy
 
    1. //好,下边来看看用C#怎么实现上边的SQL语句吧:  
    2. void Main()  
    3. {  
    4.      var query=GetSonID(3);  
    5.      Console.WriteLine("Id Name Parent");  
    6.      query.ToList().ForEach(q=>Console.WriteLine("{0} {1} {2}",q.Id,q.Name,q.Parent));  
    7.      /* 
    8.         Id       Name       Parent 
    9.         5        B2         3 
    10.         8        D1         5 
    11.         9        D2         5 
    12.             10        D3         5 
    13.      */  
    14. }  
    15. public IEnumerable<Tim_LinqTable> GetSonID(int p_id)  
    16. {  
    17.     var query = from c in this.Tim_LinqTables  
    18.            where c.Parent  == p_id  
    19.            select c;  
    20.            
    21.     return  query.ToList().Concat(query.ToList().SelectMany(t => GetSonID(t.Id)));                
    22. }  
原文地址:https://www.cnblogs.com/liuqiyun/p/8509024.html