您的位置:首页 > 数据库

LINQ TO SQL 实现无限递归查询

2018-03-05 15:01 621 查看
from:http://blog.csdn.net/q107770540/article/list

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

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


[sql] view plain copy

--构造测试数据: 只作演示用

CREATE TABLE [dbo].[Tim_LinqTable](

[Id] int PRIMARY KEY IDENTITY(1,1) NOT NULL,

[Name] [varchar](50) NOT NULL,

[Parent] int NOT NULL,

)

GO

INSERT INTO [Tim_LinqTable]

SELECT 'A',0 UNION ALL

SELECT 'A1',1 UNION ALL

SELECT 'A2',1 UNION ALL

SELECT 'B1',2 UNION ALL

SELECT 'B2',3 UNION ALL

SELECT 'C1',4 UNION ALL

SELECT 'C2',4 UNION ALL

SELECT 'D1',5 UNION ALL

SELECT 'D2',5 UNION ALL

SELECT 'D3',5

GO

WITH temp

AS

(

SELECT * FROM [Tim_LinqTable] WHERE Parent = 3

UNION ALL

SELECT m.* FROM [Tim_LinqTable] AS m

INNER JOIN temp AS child ON m.Parent = child.Id

)

SELECT * FROM temp

GO

--查询 Parent=3 的所有子数据结果如下:

Id Name Parent

----------- -------------------------------------------------- -----------

5 B2 3

8 D1 5

9 D2 5

10 D3 5

(4 row(s) affected)

[csharp] view plain copy

//好,下边来看看用C#怎么实现上边的SQL语句吧:

void Main()

{

var query=GetSonID(3);

Console.WriteLine("Id\tName\tParent");

query.ToList().ForEach(q=>Console.WriteLine("{0}\t{1}\t{2}",q.Id,q.Name,q.Parent));

/*

Id Name Parent

5 B2 3

8 D1 5

9 D2 5

10 D3 5

*/

}

public IEnumerable<Tim_LinqTable> GetSonID(int p_id)

{

var query = from c in this.Tim_LinqTables

where c.Parent == p_id

select c;

return query.ToList().Concat(query.ToList().SelectMany(t => GetSonID(t.Id)));

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: