NHibernate: Как выполнить многократную выборочную выборку для многих детей и внуков (граф объектов) за один прием в базу данных? - PullRequest
13 голосов
/ 10 марта 2011

Во-первых, пожалуйста, не пытайтесь спорить со мной из-за энергичной нагрузки - обход графа объектов и создание (из-за ленивой загрузки) даже большего, чем ОДИН обход в базу данных, просто не вариант.

У меня большой объектный граф.Я хочу получить корневой объект, а также подмножество его детей, внуков, правнуков и т. Д. В настоящее время я делаю это, создавая несколько Future объектов (с критериями), и в каждом из них яdo SetFetchMode("...", FetchMode.Eager) - см. пост Айенде и 3-й комментарий Сэма здесь .Есть две проблемы:

  1. NHibernate выполняет несколько запросов на выборку в одном цикле - один для каждого пути от корня до листа (A.B.C.D), что прекрасно, но используетjoin, а не subselect, что я действительно хочу.Использование join означает, что тонна данных должна быть отправлена ​​из базы данных, должна быть проанализирована, и nhibernate должен выполнить намного больше работы, чем необходимо.

  2. В результатепроблема 1 - дублирование объектов, вложенных более чем на один уровень в некоторых случаях.

Вторая проблема, которую я «решил», установив для моих коллекций значение Set, но затем я теряю возможность упорядочения- поскольку я должен указать ISet в качестве интерфейса, мой код не сможет узнать, действительно ли набор является OrderedSet.

Кто-нибудь знает, как выполнить за один цикл,нетерпеливая загрузка объекта плюс несколько глубоко вложенных коллекций, но без использования объединения?

Буду очень признателен!Я искал в Интернете ответы, по-видимому, я не первый, кто ударил эту стену.

1 Ответ

1 голос
/ 07 октября 2011

Вы можете создавать отдельные запросы всего одним вызовом SetFetchMode и запускать их за один раз, используя MultiCriteria (или Futures или все, что вы хотите использовать).После этого вам нужен только результат первого запроса.Это даст вам один результат за одно путешествие в оба конца.

...