Как вызвать процедуру с использованием NHibernate, которая возвращает результат из нескольких таблиц? - PullRequest
2 голосов
/ 07 января 2011

Обычно мы создаем отображение 1: 1 для каждого табличного класса.

Ex (Таблицы): [пользователи]user_id - PKназвание[операции]user_id - FKitem_idколичество Пример сопоставления: открытый класс пользователя{открытый идентификатор строки {get;задавать;}публичная строка Name {get;задавать;}}сделка публичного класса{публичная строка UserID {get;задавать;}открытая строка ItemID {get;задавать;}общедоступная десятичная сумма {get;задавать;}}Но из-за проблем с оптимизацией, а иногда необходимо выполнить операции при запросе результатов;мы обычно используем хранимые процедуры, которые возвращают результат из нескольких таблиц.Если мы используем пример выше;Как мы можем вызвать процедуру, которая возвращает результаты из объединенных таблиц?Возможно ли это без создания нового класса и привязки только ради этих объединенных записей?

Спасибо!

1 Ответ

3 голосов
/ 09 января 2011

В этом случае можно использовать хранимую процедуру, используя конструкцию отображения, подобную следующей:

<sql-query name="LoadUsersAndTransactions" xml:space="preserve">
  <return class="User" alias="u">
    <return-property name="ID" column="user_id" />
    <return-property name="Name" column="name" />
  </return>
  <return-join property="u.Transactions" alias="t">
    <return-property name="key" column="user_id" />
    <return-property name="element" column="item_id" />
    <return-property name="element.id" column="item_id" />
    <return-property name="element.Amount" column="amount" />
  </return-join>
  EXEC dbo.SelectUsersAndTransactions :param_1, ..., :param_N
</sql-query>

В этом примере предполагается, что транзакции отображаются в виде пакета в классе User. Вы бы использовали этот запрос следующим образом из C #:

IList<User> users = session
    .GetNamedQuery("LoadUsersAndTransactions")
    .SetString("param_1", parameterValue1)
    ...
    .SetString("param_N", parameterValueN)
    .List<User>();

Документация NHibernate по использованию пользовательских SQL-запросов здесь .

Cheers, Герка.

...