代码之家  ›  专栏  ›  技术社区  ›  George Mauer

NHibernate:递归查询

  •  0
  • George Mauer  · 技术社区  · 14 年前

    我有一个基本的树结构,它存储在一个表中。假设这是我的模型:

    public class TreeNode {
      public virtual Guid Id { get; private set; } 
      public virtual string Name { get; private set; }
      public virtual IEnumerable<TreeNode> Contents { get; private set; }
    }
    

    还有桌子:

    TREE_NODES
      PK_NODE Guid
      FK_NODE_PARENT Guid
    

    我想要下面的实现,其中返回值是一个TreeNode,其中包含它的子级及其子级等的完全急切加载的树。

    public class Tree {
      ISessionFactory _sessions;
      public TreeNode GetBy(Guid id) {
        using(var s = _sessions.OpenSession())
          return s.Linq<TreeNode>().Single(n => n.Id == id);
      }
    }
    

    1 回复  |  直到 14 年前
        1
  •  1
  •   Maja Piechotka    14 年前

    我怀疑你能优化它-在基本SQL中没有重复。您可以使用服务器端过程(特定于服务器的-某些服务器,如MySQL不支持它们)对其进行优化,但由于您得到的是非递归组件,这一点仍然值得怀疑。

    也许最好的方法是在加载函数中遍历树并强制进行评估。比如:

    public class TreeNode {
      public virtual Guid Id { get; private set; } 
      public virtual string Name { get; private set; }
      public virtual IEnumerable<TreeNode> Contents { get; private set; }
    }
    
    public class Tree {
      ISessionFactory _sessions;
      public TreeNode GetBy(Guid id) {
        using(var s = _sessions.OpenSession()) {
          return LoadSubTree(s.Linq<TreeNode>().Single(n => n.Id == id));  
        }
      }
      private LoadSubTree(TreeNode node) {
        foreach(var n in node.Contents)
          LoadSubTree(n);
      }
    }
    

    附言。 Tree 可能不是最好的地方 ISessionFactory .