Отображение набора коллекций nhibernate, чтобы избежать n + 1 выбора и дублирования строк с выборочным соединением - PullRequest
0 голосов
/ 12 апреля 2011

У меня есть таблица объектов и таблица псевдонимов объектов.

Псевдонимы - это просто набор строк:

object.Aliases

Если я сопоставлю коллекцию следующим образом:

<class name="Object" table="Object" lazy="false">
    ...
    properties...
    ...
    <set name="Aliases" table="Aliases" inverse="true" lazy="false" fetch="join" >
      <key column="ObjectId" />
      <element column="Name" type="String"/>
    </set>
    ...
</class>

тогда

session.CreateCriteria(typeof (T)).List<T>();

из базового репозитория, который выбирает все объекты, возвращает дубликаты для каждого псевдонима. Зачем? как я могу избавиться от дубликатов объектов в списке?

Спасибо всем за ваше время.

EDIT: Обновленные сопоставления ... но это все сопоставления. У псевдонимов нет своего собственного класса, так как это просто набор строк, которые нужно загрузить в ISet<string> Object.Aliases

Ответы [ 2 ]

1 голос
/ 12 апреля 2011

Меня это тоже смутило, когда я начал использовать NHibernate.Вот как это работает.Поскольку отображение включает fetch="join", оно использует SQL JOIN между родительской таблицей и дочерней таблицей, поэтому родительские данные повторяются для каждого дочернего элемента.Но затем вместо того, чтобы отфильтровывать дополнительные экземпляры родительского объекта, вы возвращаете коллекцию с одним объектом на строку в запросе.Вы должны указать, что вы хотите отдельные объекты.Используя синтаксис ICriteria, вы можете добавить Transformers.DistinctRootEntity к вашему запросу.

См. Получить уникальный набор результатов из NHibernate с использованием Criteria API? и ссылку, на которую он ссылается.

0 голосов
/ 12 апреля 2011

Для задачи выбора n + 1 добавьте batch-size="10" к вашим сопоставлениям

<set name="Aliases" batch-size="10" ...
...