Я сомневаюсь, что вы можете оптимизировать его - в базовом 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
.