Подтвердить что ты не робот

NHibernate: Как выполнить целевую подзадачу выборки многих детей и внуков (графа объектов) в одном обратном направлении в базу данных?

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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