在C#中模拟CTE递归

在C#中模拟CTE递归,第1张

概述假设有以下CTE返回我拥有的一些树数据(邻接模型)的级别(从 Hierarchical data in Linq – options and performance开始): WITH hierarchy_cte(id, parent_id, data, lvl) AS( SELECT id, parent_id, data, 0 AS lvl FROM dbo.hierarchi 假设有以下CTE返回我拥有的一些树数据(邻接模型)的级别(从 Hierarchical data in Linq – options and performance开始):
WITH hIErarchy_cte(ID,parent_ID,data,lvl) AS(    SELECT ID,0 AS lvl    FROM dbo.hIErarchical_table    WHERE (parent_ID IS NulL)    UNION ALL    SELECT t1.ID,t1.parent_ID,t1.data,h.lvl + 1 AS lvl    FROM dbo.hIErarchical_table AS t1     INNER JOIN hIErarchy_cte AS h ON t1.parent_ID = h.ID)SELECT ID,lvlFROM hIErarchy_cte AS result

我想知道在C#而不是sql中执行递归是否会增加任何性能.任何人都可以告诉我如何执行CTE与递归C#函数相同的工作,假设我有一个Iqueryable,其中Tree是一个表示层次表中的条目的实体;沿着以下方向的东西:

public voID RecurseTree(Iqueryable<Tree> tree,GuID userID,GuID parentID,int level){    ...    currentNode.level = x    ...    Recurse(tree...,level + 1)}

看到这很容易使用lambda表达式很酷

解决方法 在sql Server中的递归是比较缓慢的,但它确实有效.

我不得不说T-sql有点有限,但从来没有这样做是为了做所有这些 *** 作.我不相信有什么办法可以让这个事情发生在一个Iqueryable如果你打算运行这个对你的sql Server实例,但你可以在内存中运行代码使用liNQ对对象在一个相对的紧凑的方式.

这是一种方法:

class TreeNode{    public int ID;    public int? ParentID;}static voID Main(string[] args){    var List = new List<TreeNode>{        new TreeNode{ ID = 1 },new TreeNode{ ID = 4,ParentID = 1 },new TreeNode{ ID = 5,new TreeNode{ ID = 6,new TreeNode{ ID = 2 },new TreeNode{ ID = 7,ParentID= 2 },new TreeNode{ ID = 8,ParentID= 7 },new TreeNode{ ID = 3 },};    foreach (var item in Level(List,null,0))    {        Console.Writeline("ID={0},Level={1}",item.Key,item.Value);    }}private static IEnumerable<keyvaluePair<int,int>> Level(List<TreeNode> List,int? parentID,int lvl){    return List        .Where(x => x.ParentID == parentID)        .SelectMany(x =>             new[] { new keyvaluePair<int,int>(x.ID,lvl) }.Concat(Level(List,x.ID,lvl + 1))        );}
总结

以上是内存溢出为你收集整理的在C#中模拟CTE递归全部内容,希望文章能够帮你解决在C#中模拟CTE递归所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1237160.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存