nhibernate выбирает все дерево - PullRequest
       3

nhibernate выбирает все дерево

1 голос
/ 09 сентября 2010

Мне нужна помощь в извлечении древовидной иерархии из БД с использованием nhibernate 3.0

 QueryOver.Of<Enterprise>(() => entAlias)
     .JoinAlias(() => entAlias.ChildEntities, () => childEntityAllias, JoinType.LeftOuterJoin)
     .TransformUsing(new DistinctRootEntityResultTransformer())

Я получаю только два уровня графика (родитель и его дети), но не дети детей и т. Д.

То же самое, если я попытаюсь достать родителей листа. Я получаю только родитель листа, но не родитель родителя родителя ... листа. где уровень = n.

Хо, чтобы сделать этот тип запроса. не важно, если Icriteria, linq, HQL или другое.

Ответы [ 2 ]

1 голос
/ 06 декабря 2010

Вы можете использовать размер пакета для более эффективного извлечения детей.

<bag name="Childen" batch-size="20" ...>

Дочерние объекты по-прежнему загружаются отдельными запросами (вы не должны больше их объединять в запросе), но всегда 20 одновременно. Превращает «N + 1» в «N / 20 + 1», что обычно очень хорошо. Преимущество этого решения в том, что вам не нужно заботиться о своих запросах.

Вы также можете загружать родителей партиями:

<class name="Enterprise" batch-size="20">

По возможности загружает отношения "один к одному" с предприятиями в пакетах.

Если вам нужна дополнительная оптимизация, попробуйте добавить ссылку на корень (самый верхний родительский элемент). Затем вы можете загрузить все дочерние элементы корня в одном простом запросе. Недостатком является то, что вам нужно заботиться об этом справочнике, это избыточность, которую также сложно поддерживать.

0 голосов
/ 06 декабря 2010

Если вы действительно хотите получить все (хотя я не уверен, зачем вам это нужно), отключите отложенную загрузку (таким образом, активную загрузку) в NHibernate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...