производительность много-к-одному - PullRequest
0 голосов
/ 02 февраля 2011

У меня есть две таблицы с отношением «многие к одному», и у меня проблема с производительностью при чтении всех данных из базы данных.

ClassA является родителем ClassB

Конфигурация ClassA

<id name="Id">
  <generator class="native" />
</id>

<property name="FieldA1" column="FieldA1" />
<many-to-one name="ClassB" column="ClassBId" />

Конфигурация ClassB

<id name="Id">
  <generator class="native" />
</id>

<property name="FieldB1" column="FieldB1"/>

Я хотел бы получить список объектов classA, где объект ClassA содержит объект classB сразу.

При запросе всех данных из ClassA это работаеточень хорошо, но очень медленно, потому что для каждой записи ClassA выполняется оператор sql (выберите * из ClassB, где Id == ClassA.ID), чтобы получить класс B. Установка флага lazy в true, не является решением, потому что мне нужноданные ClassB.

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

Спасибо!

Ответы [ 2 ]

1 голос
/ 02 февраля 2011

Вы должны иметь возможность установить SetFetchMode в FetchMode.Join, и тогда он отправит один запрос в базу данных. См. http://davidhayden.com/blog/dave/archive/2008/12/06/ImprovingNHibernatePerformanceFetchingStrategiesFetchModeFluentNHibernate.aspx для примера, который может указать вам правильное направление.

0 голосов
/ 08 февраля 2011

При написании запроса вы также можете указать тип соединения, если не все ваши ClassA имеют ClassB.

query.CreateAlias("ClassB", "B", JoinType.LeftOuterJoin);
...