Вызовите нетерпеливый выбор в NHibernate

Я пытаюсь нетерпеливо выбрать использование наборов, выбирает, но все, что я получаю, является внутренними объединениями. Что продолжается?

Session.CreateCriteria(typeof(Foo))
    .SetFetchMode("Bars", FetchMode.Select)
    .CreateAlias("Bars", "b")
    .SetFetchMode("b.Bazes", FetchMode.Select)
    .List();

Я попытался изменить FetchMode на Нетерпеливый, но это не работает - я все еще получаю внутренние объединения вместо отдельных выборов. Я не уверен, где это даже получает внутреннее объединение от, потому что ничто в документах не говорит о FetchMode, вызывающем внутренние объединения. Действительно ли возможно получить нетерпеливые выборы?

Обновление хорошо, я решил, что создание псевдонима вызывает внутреннее объединение. Таким образом, я могу использовать.CreateAlias ("Панели", "b", JoinType. Ни один), но тогда выборка b. Основания возвращаются к ленивой загрузке. Urgh.

9
задан cbp 15 December 2009 в 04:19
поделиться

2 ответа

ВНУТРЕННЕЕ СОЕДИНЕНИЕ - это то, как NHibernate будет загружать ваши записи и связанные с ними дочерние записи. Обычно это наиболее эффективный способ сделать это.

Если бы использовалось несколько операторов SELECT, тогда запрос для дочерних элементов должен был бы каким-то образом включать критерии для родителя. ВНУТРЕННЕЕ СОЕДИНЕНИЕ упрощает получение только связанных дочерних элементов, NHibernate правильно разделит их на несколько сущностей после выполнения запроса.

Я считаю, что Entity Framework 4 позволит вам выполнять несколько запросов и «волшебным» повторно присоединять связанные объекты, но я не знаю, что у NHibernate есть такая функция (уверен, что кто-нибудь поправит меня, если я ошибаюсь).

1
ответ дан 5 December 2019 в 02:07
поделиться
Session.CreateCriteria(typeof(Foo))
   .SetFetchMode("Bars", FetchMode.Select)
   .CreateAlias("Bars", "b")  <-- this line triggers a join ( think )
   .SetFetchMode("b.Bazes", FetchMode.Select) 
   .List();

Если вам действительно не нужны объединения, вы можете указать в сопоставлении fetch = "select", но это вызовет выбор N + 1, что не рекомендуется (один выбор для каждого объекта Foo, а затем по одному для каждого Baze)

0
ответ дан 5 December 2019 в 02:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: