C# 从邻接模型+;嵌套集模型(MPTT)

C# 从邻接模型+;嵌套集模型(MPTT),c#,sql-server,.net-core,tree,nested-set-model,C#,Sql Server,.net Core,Tree,Nested Set Model,我有一个带SQL Server DB的.NET Core 2.2应用程序,我使用邻接模型+嵌套集模型存储用户的层次结构。我用的是EF Core。我的域名如下所示: public class MatrixPosition { public Guid Id { get; set; } public string Name { get; set; } public Guid? ParentId { get; set; }

我有一个带SQL Server DB的.NET Core 2.2应用程序,我使用邻接模型+嵌套集模型存储用户的层次结构。我用的是EF Core。我的域名如下所示:

    public class MatrixPosition
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
        public Guid? ParentId { get; set; }
        public int Left { get; set; }
        public int Right { get; set; }
        public int DepthLevel { get; set; }
}
最上面的元素当然有
ParentId=null
DepthLevel=0


我想把这个结构显示为一些树结构图形。有人对此有什么想法或工作实例吗

我过去使用过的一种方法是将一些重物移动到外部框架,如。你可以让你的应用程序生成一个文本文件,该文件由一个名为“dot”的实用程序处理以生成图形。优点是它是开源的、广泛使用的、跨平台的。缺点是让图表完全按照您想要的方式显示的语法可能会令人困惑。下面是我使用您的模式创建的一个示例

首先,我创建了一个递归查询来返回记录及其父项。我用名字填充它,就好像它是一个组织结构图一样。如果你想做实验,你可以找到小提琴,但这里是查询

WITH cteEEs AS (
  SELECT employees.Id, employees.ParentId, employees.Name, employees.[Left], employees.[Right] FROM employees WHERE employees.ParentId IS NULL
  UNION ALL 
  SELECT employees.Id, employees.ParentId, employees.Name, employees.[Left], employees.[Right] FROM employees JOIN cteEEs ON (employees.ParentId = cteEEs.Id)
)

SELECT * FROM cteEEs
通过使用以下代码

var nodeRelationships = new StringBuilder();
var nodeDetails = new StringBuilder();

foreach(var node in results)
{
    if(!string.IsNullOrEmpty(node.ParentId))
    {
        nodeRelationships.AppendLine($"\t\"{node.ParentId}\" -> \"{node.Id}\"");
    }

    nodeDetails.AppendLine($"\t\"{node.Id}\" [label=\"{node.Name}\"]");
}

using(StreamWriter sw = new StreamWriter(@"c:\temp\test.dot"))
{
    sw.WriteLine("digraph G {");
    sw.Write(nodeRelationships.ToString());
    sw.Write(nodeDetails.ToString());
    sw.WriteLine("}");
}
。。。我可以生成以下文本文件

digraph G {
    "bec9439f-d4fb-4ee5-9d69-c33f54f91124" -> "79b5be71-0e01-4d0c-9640-ddfd98634b96"
    "bec9439f-d4fb-4ee5-9d69-c33f54f91124" -> "a5718293-1f93-4450-ad92-a89458d5600e"
    "a5718293-1f93-4450-ad92-a89458d5600e" -> "eaf07cbc-fd5c-4cc5-829e-166ff20b2ef9"
    "a5718293-1f93-4450-ad92-a89458d5600e" -> "7b4dbc24-6ab6-4585-bca3-95888c713f3c"
    "bec9439f-d4fb-4ee5-9d69-c33f54f91124" [label="Doe, Jane"]
    "79b5be71-0e01-4d0c-9640-ddfd98634b96" [label="Smith, Jim"]
    "a5718293-1f93-4450-ad92-a89458d5600e" [label="Jones, Bill"]
    "eaf07cbc-fd5c-4cc5-829e-166ff20b2ef9" [label="Adams, Sherri"]
    "7b4dbc24-6ab6-4585-bca3-95888c713f3c" [label="Walker, Dan"]
}
运行以下命令

dot-Tpng test.dot-o test.png

将我的文本文件(test.dot)作为输入,并生成test.png作为输出。输出如下所示

如果您查看点语言的参考,您会发现这是一个简单的示例,您可以做很多事情来影响结果的外观


因此,您的应用程序可以生成适当的文本,并在后台使用点创建图像,然后应用程序将显示该图像。

当您说“显示此结构”时,您是想要静态图像,还是想要生成一个用户可以展开/折叠/重新排序等的交互式图表?当你说“树”时,你是指一个传统的组织结构图还是你在文件浏览器中看到的那种用人名而不是文件夹的树?@dazed说“显示此结构”时感到困惑,我只想要一个静态图像,只有只读的。我所说的“树”只是指传统的组织结构图。你知道我只想要像这样的东西->-或者当然是类似的简单的东西,只是为了看看structure@dazedandconfused你指的是用户可以展开/折叠/重新排序等的交互式图表。你过去有机会这样做吗?今晚我会试试,但非常感谢你非常详细的回答!)看起来很棒!