В NHibernate как мне объединить два экземпляра DetachedCriteria

Мой сценарий таков: у меня есть базовый запрос 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 ответ

Решение

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

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

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

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

Другие вопросы по тегам