NHibernate Как сделать Criteria внутренним соединением без увлажняющих объектов? - PullRequest
1 голос
/ 14 марта 2011

Некоторая проблема с nhibernate:

У меня есть таблицы sql:

Item { Id, Name }
ItemRange { Id, Name }
ItemHasItemRange { Id, ItemId, ItemRangeId } 

Сопоставления просты, поэтому я не буду их вставлять, ItemId и ItemRangeId являются внешними ключами, класс Item имеет коллекцию ItemHasItemRanges, отображаемую как ленивый пакет.

Мне нужны все элементы, в частности ItemRange, но я не хочу получать связанные ItemRangeObjects, я просто хочу выполнить внутреннее объединение для получения узких результатов.

Когда я делаю это так:

c.CreateCriteria("Item", "i")
  .CreateAlias("ItemHasItemRanges", "ihpr", JoinType.InnerJoin)
  .Add(Restrictions.Eq("ihpr.ItemRange.Id", I18nHelper.CurrentItemRange.Id));

Работает нормально, но все ItemHasItemRange объекты также извлекаются в коллекции Item.ItemHasItemRanges (которые отображаются как ленивые)

Я не хочу получать Item.ItemHasItemRanges, потому что это занимает время. Я просто хочу сделать внутреннее объединение, чтобы ограничить набор результатов. Это возможно в NHibernate?

Ответы [ 2 ]

0 голосов
/ 14 марта 2011

Я обнаружил, что проблема была где-то еще.Таблица ItemHasItemRange не имела нескольких индексов для ItemId, а ItemRangeId - id имел только отдельные индексы для каждого поля.Вот почему производительность была так плоха.

Но вопрос NHibernate по-прежнему актуален - возможно ли создать внутреннее объединение для критериев только для того, чтобы сузить результаты и не извлекать все объединенные объекты, которые обычно ленивы.

0 голосов
/ 14 марта 2011

Так что я думаю, что вы просто хотите получить эти объекты, чтобы показать обзор / список, и вы не собираетесь «что-то» делать с этими объектами (если, возможно, не загрузите один из них)?

В этом случае, я думаю, вам лучше работать с «проекциями».Вот сценарий:

  • Вам нужно будет создать (простой) класс, который будет просто содержать свойства, которые вы хотите показать (где вы заинтересованы).

  • Вам придется «импортировать» этот класс в NHibernate, чтобы NHibernate знал о его существовании.

  • Далее вы можете создать свой оператор Criteria следующим образом:у вас есть это сейчас.(Работа с классами вашего домена).

  • Затем вы должны указать, как должна выглядеть проекция.То есть, как свойства вашей сущности Item отображаются на свойства вашего класса DTO / View (= простой класс, который вы только что создали).

  • Укажите, что AliasToBean ResultTransformer должен использоваться.

Затем выполните запрос Criteria.NHibernate сможет создать самый простой запрос, необходимый для получения всех необходимых данных.

Я объяснил нечто подобное здесь

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