NHibernate: рекурсивные запросы - PullRequest
0 голосов
/ 06 августа 2010

У меня есть базовая древовидная структура, которая хранится в одной таблице. Допустим, это моя модель:

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 Ответ

1 голос
/ 06 августа 2010

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

...