В NHibernate как мне объединить два экземпляра DetachedCriteria - PullRequest
0 голосов
/ 12 апреля 2010

Мой сценарий таков: у меня есть базовый запрос NHibernate для запуска формы (я кодировал его с помощью DetachedCriteria, но опишу его здесь с использованием синтаксиса SQL):

SELECT * FROM Items I INNER JOIN SubItems S on S.FK = I.Key

Пользовательский интерфейс для отображения результатов этого объединения позволяет пользователю указать дополнительные критерии: Скажите:

I.SomeField = 'UserValue'.

Теперь мне нужна последняя команда загрузки:

SELECT * FROM Items I INNER JOIN SubItems S on S.FK = I.Key
WHERE I.SomeField = 'UserValue'

Моя проблема: я создал DetachedCriteria со «статическим» аспектом запроса (верхнее соединение), а пользовательский интерфейс создает DetachedCriteria с «динамическим» компонентом запроса. Мне нужно объединить эти два в окончательный запрос, который я могу выполнить в сеансе NHibernate.

DefaultCriteria.Add () принимает ICriterion (который создается с использованием класса Expression и, возможно, других неизвестных мне классов, которые могли бы решить мою проблему).

Кто-нибудь знает, как я могу делать то, что хочу?

1 Ответ

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

Вы можете использовать GetExecutableCriteria, чтобы превратить отдельный критерий в исполняемую форму для определенного сеанса:

var query = DetachedCriteria.For<...>();

using (var session = ...)
using (var transaction = session.BeginTransaction())
{
    query.GetExecutableCriteria(session)
    transaction.Commit();
}

Однако я думаю, что ваш дизайн немного испорчен. Пользовательский интерфейс должен дополнять критерии, а не создавать свои собственные. В худшем случае он должен генерировать ICriterion, которые затем добавляются к вашим критериям перед выполнением. В лучшем случае вы бы абстрагировали возможности фильтрации в слой, полностью независимый от вашей технологии ORM, а затем применили фильтры из пользовательского интерфейса к основным критериям.

...