[知识分享] LINQ TO SQL 实现无限递归查询

q107770540 2012-06-28 05:45:02
加精
见论坛内有网友提问类似的问题已经不止一次了,
现总结一下,希望能给以后再碰到此类问题的朋友一些帮助



--构造测试数据: 只作演示用
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)



//好,下边来看看用C#怎么实现上边的SQL语句吧:
void Main()
{
var query=GetClassID(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> GetClassID(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 => GetClassID(t.Id)));
}


更多LINQ知识分享,请参考:
http://blog.csdn.net/q107770540
...全文
14223 92 打赏 收藏 转发到动态 举报
写回复
用AI写文章
92 条回复
切换为时间正序
请发表友善的回复…
发表回复
手可摘星辰 2012-11-05
  • 打赏
  • 举报
回复
支持楼主啦......
songjinxi123 2012-11-05
  • 打赏
  • 举报
回复
看不太懂LINQ啊,看来要去学习下了。
q107770540 2012-11-05
  • 打赏
  • 举报
回复
引用 84 楼 chjiamin 的回复:
效率太差啊。 我写存储过程从10万多条数据中检索321条的一棵树(仅知道树根),只有2秒左右,在我笔记本上。用这种方式在LinqPad中要21秒。 用了EF,还要写存储过程,难过啊,有没有更好的办法呢?
那就继续使用存储过程。。用了EF,也不能放弃了存储过程
lion____ 2012-10-30
  • 打赏
  • 举报
回复
支持楼主啦......
残月照我心 2012-10-29
  • 打赏
  • 举报
回复
[Quote=引用 64 楼 的回复:]
感觉Linq是将谁都看的懂的sql写成鬼都看不懂
[/Quote]
鬼看懂SQL,看不懂LINQ,人都变成鬼了..
lyh2ysy 2012-10-08
  • 打赏
  • 举报
回复
学习中~谢谢分享!
qjw9004 2012-10-07
  • 打赏
  • 举报
回复
学习中!
有朋友能指点一下如何做清除panel1中TextBox吗?
TextBox是以动态的添加到panel1中的,TextBox命有
Memo01,Memo02,Memo03....
Money01,Money02,Money03...
最好是能详细的注明代码作用!非常感谢!
chjiamin 2012-10-03
  • 打赏
  • 举报
回复
效率太差啊。

我写存储过程从10万多条数据中检索321条的一棵树(仅知道树根),只有2秒左右,在我笔记本上。用这种方式在LinqPad中要21秒。
用了EF,还要写存储过程,难过啊,有没有更好的办法呢?
timfeng2009 2012-07-16
  • 打赏
  • 举报
回复
这个如何

/// <summary>
/// 对于可以树型化的数据进行树型化
/// </summary>
/// <typeparam name="T">需要树型化的数据类名</typeparam>
/// <param name="collection">顶级树形集合</param>
/// <param name="action">项处理过程</param>
/// <param name="func">次级栏目获取方法</param>
/// <param name="depth">深度,默认从0开始</param>
public void CTree(IQueryable<T> collection, Action<T, int> action, Func<T, IQueryable<T>> func, int depth = 1)
{
foreach (var t in collection)
{
action(t, depth);
var list = func(t);
CTree(list, action, func, depth + 1);
}
}
#endregion
LAONINGA098 2012-07-09
  • 打赏
  • 举报
回复
支持一下下
panguanglei163com 2012-07-05
  • 打赏
  • 举报
回复
谢谢分享!
gzc145 2012-07-05
  • 打赏
  • 举报
回复
好贴必须顶!
sinuotec86 2012-07-03
  • 打赏
  • 举报
回复
支持一下子
rczjp 2012-07-02
  • 打赏
  • 举报
回复
谢谢楼主分享!
  • 打赏
  • 举报
回复
感谢分享,学习!
funip 2012-07-02
  • 打赏
  • 举报
回复
thankyou!!!!!!
chenge126 2012-07-02
  • 打赏
  • 举报
回复
up~!谢谢分享
i945800687 2012-07-01
  • 打赏
  • 举报
回复
谢谢楼主分享
q107770540 2012-07-01
  • 打赏
  • 举报
回复
[Quote=引用 64 楼 的回复:]

感觉Linq是将谁都看的懂的sql写成鬼都看不懂
[/Quote]
呵呵。。。能看的懂SQL的鬼也不多啊。。。
zzxap 2012-07-01
  • 打赏
  • 举报
回复
感觉Linq是将谁都看的懂的sql写成鬼都看不懂
加载更多回复(45)

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧