【问题标题】:Fill a Recursive Data Structure from a Self-Referential Database Table从自引用数据库表中填充递归数据结构
【发布时间】:2009-12-29 19:09:30
【问题描述】:

这个问题指的是http://www.matthidinger.com/archive/2009/02/08/asp.net-mvc-recursive-treeview-helper.aspx

假设我有一张如下所示的表格:


(来源:matthidinger.com

我有一个递归数据结构,如下所示:

public class TreeNode
{
    public TreeNode(){}
    public string NodeId { get; set; }
    public string ParentId { get; set; }
    public string Name { get; set; }
    public IEnumerable<TreeNode> Children { get; }
}

如何使用 Linq 从表中填充这个递归数据结构?

注意:对于这个问题,请假设我已经有一个非常有效的表;即它完全驻留在内存中,或者正在使用 CTE 进行访问。真的,我只是在寻找 Linq 查询以将其从 Linq 到 SQL DataContext 到递归对象。我知道它可能会涉及 ForEach 和递归函数调用;我就是想不通。

提前致谢。

【问题讨论】:

标签: c# sql-server linq linq-to-sql


【解决方案1】:

我认为您最好的选择是使用 CTE 查询 SQL 中的层次结构。 LINQ2SQL 和分层/关系数据不能很好地混合。见Hierarchical data in Linq - options and performance

【讨论】:

  • 我从 MSDN 示例中看到,这会以正确的层次顺序生成一个列表。这是否允许我线性地遍历列表来构建我的递归结构,这就是性能更好的原因吗?
  • CTE 查询是在 SQL 中为“我需要当前节点的所有子节点以及子节点的子节点等”生成结果集的唯一方法。不是顺序问题(这只是执行的副作用),而是正确性。如果您有能力在客户端获取 整个 表,则无需使用 CTE,只需使用普通查询即可构建内存树。此外,如果您只需要当前节点的子节点(例如,实例化 Childrens 迭代器),那么再次不需要 CTE,普通的 SELECT ... WHERE Parent=@id 就可以了。
猜你喜欢
  • 1970-01-01
  • 2015-06-29
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
相关资源
最近更新 更多