Сопоставление свойств на основе динамических критериев во время выполнения - PullRequest
0 голосов
/ 25 февраля 2010

Я просеивал страницы в Google в поисках ответа, но безрезультатно, но, думаю, я просто неправильно сформулировал вопрос.

Сценарий таков: у меня есть объект, за который пользователи могут голосовать за или против. Для аргументации давайте назовем сущность бизнесом.

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

В SQL это просто, я могу создать функцию SQL, которая выполняет это разрешение на основе параметра ": userid", более конкретно, который может быть передан в proc. т.е.

   SELECT
      BusinessId,
      CreatedOn,
      Username,
      [Content].ResolveBusinessVoteIndicator(:userid, P.BusinessId) AS VoteIndicator
   FROM 
      Content.Business P

Основная проблема здесь заключается в том, что мне нужно создать объект, который сопоставляется с результатом хранимой процедуры. Что плохо, потому что теперь я не могу использовать HQL или Критерии, которые были бы предпочтительными методами.

Другой вариант - выполнить запрос, а затем просто выполнить итерацию по результату и установить это свойство, которое будет работать, если вы просматриваете один бизнес за раз, но мне нужно отобразить большой список предприятий за один раз .

Так что я предполагаю, что вопрос ... Есть ли способ сопоставить свойство, используя HQL или Критерии, где это отображение основано на формуле, которая требует ввода во время выполнения? Аналогично передаче параметров в хранимую процедуру и отображению результатов.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2010

Ответ Дерика является правильным, если вы хотите создать представление для каждого бизнес-требования.

То, чего вы хотите достичь, можно сделать с помощью IFilter. Рассмотрим это сопоставленное свойство hbm.xml в Business классе

<property name="IsVoted" type="boolean" update="false" insert="false" formula="(SELECT [Content].ResolveBusinessVoteIndicator(:loggedOnUser.userId, BusinessId)"/>

и о самом классе

 public bool IsVoted {get;set;}

Обратите внимание, что параметр BusinessId внутри хранимой процедуры ResolveBusinessVoteIndicator должен быть столбцом Id таблицы Business, и NHibernate создаст для него соответствующие псевдонимы. теперь это зависит от следующего элемента xml, который может быть определен в отдельном файле (скажем, filters.hbm.xml)

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <filter-def name="loggedOnUser">
        <filter-param name="userId" type="Int32"/>
    </filter-def>
</hibernate-mapping>

и во время выполнения вы включаете фильтр программно, как

nhSession.EnableFilter("loggedOnUser").SetParameter("userId", GetLoggedOnUserId());

перед выполнением ваших запросов. Кроме того, вы можете использовать это непосредственно в hql (pseudo-hql: 'из Business b, где b.IsVoted = true', чтобы получить все проголосовавшие компании)

0 голосов
/ 26 февраля 2010

вы действительно говорите о ViewModel, в этой ситуации. у вас не должно быть этого свойства в бизнес-объекте, но вы должны создавать модель представления, представляющую бизнес-объект с флагом, о котором вы говорите.

Если вы действительно хотите сделать это с помощью NHibernate, создайте представление в вашей базе данных и сопоставьте модель представления с представлением. тогда вы можете запустить HQL / Criteria против него, как и любой другой объект. Я сделал это много, и это хорошо работает.

Вы также можете использовать набор данных, чтобы получить результаты из сохраненного процесса и привязать к набору данных. помните, что ваша модель домена (бизнес-сущность) не совпадает с моделью представления (класс бизнес с голосованием) и, вероятно, не должна запускаться из того же кода доступа к данным.

Грег Янг много говорит об этом подходе в своем блоге. например: http://codebetter.com/blogs/gregyoung/archive/2010/02/15/cqrs-is-more-work-because-of-the-read-model.aspx

...