在 C# 中自动执行树遍历

本文关键字:执行 遍历 | 更新日期: 2023-09-27 18:36:20

美好的一天,朋友们!目前,我正在研究这个数据库模型设计,称为修改的预序树遍历(MPTT)。在看到使用公用表表达式 (CTE) 的缺点(由于其质量性能较差)之后,我找到了使用 MPTT 的建议。但在使用 MPTT 的优势之前,我需要通过添加"右"和"左"节点值来重新设计我的数据库表。为此,我需要创建一个程序来自动化和更新表中每个数据的值。我的问题是我无法制作一个自动执行节点值的程序。我正在尝试将 php 语言转换为 C# 代码,但我无法做到。我在编程方面的弱点之一是创建"递归"方法。

我使用此链接作为参考。分层数据库模型

这是我尝试转换为 C# 的代码

<?php 
function rebuild_tree($parent, $left) {   
    // the right value of this node is the left value + 1   
    $right = $left+1;   
    // get all children of this node   
    $result = mysql_query('SELECT title FROM tree '.   
                           'WHERE parent="'.$parent.'";');  
    while ($row = mysql_fetch_array($result)) {   
        // recursive execution of this function for each   
        // child of this node   
        // $right is the current right value, which is   
        // incremented by the rebuild_tree function   
        $right = rebuild_tree($row['title'], $right);   
    }   
    // we've got the left value, and now that we've processed
    // the children of this node we also know the right value   
    mysql_query('UPDATE tree SET lft='.$left.', rgt='.   
                 $right.' WHERE title="'.$parent.'";');   
    // return the right value of this node + 1   
    return $right+1;   
}   
?>

在 C# 中自动执行树遍历

这是我

自己的代码,如果有更好的解决方案,请告诉我

    int right = 0;
    public int rebuild_tree(int parent, int left)
    {
        // the right value of this node is the left value + 1
        right = left + 1;
        // get all children of this node
        command = conn.CreateCommand();
        command.CommandText = "SELECT cat_id FROM tbl_RefDataCategory_mst WHERE parent_id=@parent";
        command.Parameters.Add("parent", SqlDbType.Int).Value = parent;
        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                int temp = Convert.ToInt32(reader["cat_id"]);
                right = rebuild_tree(temp, right);
            }
            command = conn.CreateCommand();
            command.CommandText = "UPDATE tbl_RefDataCategory_mst SET lft=@l, rgt=@r WHERE cat_id=@p";
            command.Parameters.Add("l", SqlDbType.Int).Value = left;
            command.Parameters.Add("r", SqlDbType.Int).Value = right;
            command.Parameters.Add("p", SqlDbType.Int).Value = parent;
            command.ExecuteNonQuery();
        }
        return right + 1;
    }