我有一个存储在单个表中的基本树结构。让我们说这是我的模特:
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);
}
}
我该怎么做这个映射?
答案 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
的最佳位置。