c# - 循环递归自连接表

标签 c# sql .net sql-server linq

我有以下 SQL Server 表结构,它是一个逻辑树文件夹结构。

SQL Server Table Structure

我在 SQL Server 中使用 Linq to SQL。

我想做的是循环并在内存中创建文件夹结构,从根目录到所有子目录的主要父目录的分层文件夹。

Folder structure

我正在尝试使用一些 foreach 循环来完成它,但我还是不明白。我想我必须使用某种递归方式。

我试过的一些查询:

var flds = from folders in repo.Folders
                                   join folders2 in repo.Folders on folders.Id equals folders2.idParent
                                   select folders;

我的目标是迭代该文件夹逻辑结构。

最佳答案

如果你想在你的表中获取文件夹作为层次结构,你可以像这样创建它:

    var tableData = repo.Folders.ToList();
    var directories = tableData.Select(f => GetPath(f, table));

正如您所问,创建文件夹层次结构的递归方法是:

    private static string GetPath(Folder f)
    {
        if (f.IdParent == 0)
        {
            return f.Name;
        }
        else
        {
            var parent = tableData.Find(d => d.Id == f.IdParent);
            return GetPath(parent) + "|" + f.Name;
        }
    }

你会得到这样的输出:

Output

它会给你一个完整的文件夹层次结构,我不知道你想怎么用它。所以你可以根据你的需要做一些修改。希望对您有所帮助!

我在这里添加代码来迭代和创建文件夹结构:

        foreach (var dir in directories)
        {
            var folders = dir.Split('|');
            var path = string.Empty;
            foreach (var folder in folders)
            {
                path = path + "\\" + folder;  // modify the path like '\\' if it is not valid I have not tested
                CreateFolder(path); // implement this method for actual creation of folders
            }
        }

以及您创建文件夹的方法:

private static void CreateFolder(string directory)
    {
        var path = "C:" + directory; // add whenever you want to create structure
        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }
    }

关于c# - 循环递归自连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24241155/

相关文章:

C# 表达式 - FatalExecutionEngineError

mysql - 使用 not contains 代替 not in

sql - 维护客户数据

c# - .NET - 加拿大日期时间格式错误

c# - 为什么我在使用 FileMode.OpenOrCreate 时收到 FileNotFoundException?

.net - ReaderWriterLockSlim(不是 slim )替换,递归,可升级读取?

c# - 将 DataSource 属性添加到自定义 WinForms 控件

c# - 为什么我的 C# 代码没有从我的 Oracle 函数中获得返回值?

c# - 包含空值的 Linq 查询

mysql 更新查询不适用于高数字