NHibernate:递归查询

时间:2010-08-06 16:38:41

标签: nhibernate nhibernate-mapping

我有一个存储在单个表中的基本树结构。让我们说这是我的模特:

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

NODE_NAME Varchar

我想要以下实现,其中返回值是一个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 个答案:

答案 0 :(得分:1)

我怀疑你可以优化它 - 在基本的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);
  }
}

PS。 Tree可能不是ISessionFactory的最佳位置。