В 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, а затем применили фильтры из пользовательского интерфейса к вашим основным критериям.