NHibernate: Как выполнить целевую подзадачу выборки многих детей и внуков (графа объектов) в одном обратном направлении в базу данных?
Во-первых, пожалуйста, не пытайтесь аргументировать меня из-за того, что я нахожусь в ожидании загрузки - обход графа объекта и причинение (при ленивой загрузке) даже больше, чем ОДИН круглый путь к базе данных - это просто не вариант.
У меня большой граф объектов. Я хочу получить корневой объект плюс подмножество его детей, внуков, правнуков и т.д. В настоящее время я делаю это, создавая несколько объектов Future
(с критериями) и в каждом из них, Я делаю SetFetchMode("...", FetchMode.Eager)
- см. Ayende post и Сэм 3-й комментарий здесь.
Есть две проблемы:
-
NHibernate выполняет несколько запросов выбора в одном и том же раунде - по одному для каждого пути от корня до листа (A.B.C.D
), что отлично, но использует join
, а не subselect
, что и есть Я действительно хочу, чтобы это произошло. Использование join
означает, что тонна данных должна быть отправлена из базы данных, должна быть проанализирована, и nhibernate должен выполнять гораздо больше работы, чем необходимо.
-
В результате проблемы 1 - дублирование объектов в некоторых случаях вложено более чем на один уровень.
Вторая проблема, которую я "решил", установив мои коллекции в Set, но затем я потеряю способность упорядочивания - поскольку я должен указать ISet
в качестве интерфейса, нет никакого способа, чтобы мой код знал, действительно ли набор a OrderedSet
.
Кто-нибудь знает, как выполнять в одностороннем путешествии нетерпеливую загрузку объекта плюс несколько глубоко вложенных коллекций, но не используя join?
Буду очень признателен! Я просмотрел Интернет для ответов, видимо, я не первый, кто попал в эту стену.
Ответы
Ответ 1
Вы можете создавать отдельные запросы только с одним вызовом SetFetchMode и запускать их за один раз, используя MultiCriteria (или Futures или все, что вы хотите использовать). После этого к вам относится только результат первого запроса.
Это даст вам один результат за один раунд.