Я пытаюсь построить поисковый запрос с использованием NHibernate, который будет фильтровать параметры из нескольких разных таблиц и привести к несколько разумному SQL, который может использовать преимущества отложенной загрузки NHibernate.Читая различные советы онлайн, кажется, что самый последний и лучший способ сделать это - использовать объект QueryOver для условного добавления используемых параметров, как в следующем фрагменте:
Hibernate.Criterion.QueryOver<Models.Site, Models.Site> query = NHibernate.Criterion.QueryOver.Of<Models.Site>();
if (!string.IsNullOrEmpty(state))
query = query.WhereRestrictionOn(r => r.State.StateName).IsInsensitiveLike("%" + state + "%");
if (startDate.HasValue)
query = query.Where(r => r.Events
.Where(e=>e.EventDate >= startDate.Value)
.Count() > 0
);
return query.GetExecutableQueryOver(currentSession).Cacheable().List();
(у события есть внешний ключ к сайту)
У меня два вопроса: как фильтровать дочерние объекты, а не только родительский?Пример кода выше дает мне все сайты с совпадающими событиями, но на этом сайте я хочу только совпадающие события.Если я должен использовать соединение или подзапрос, как?Меня смущает поддержание моей древовидной иерархии с отложенной загрузкой через объединение или подзапрос.
Редактировать: на этот вопрос дан ответ.Спасибо, псуса! Как добавить предложение или?Я нашел ссылку на объект Disjunction, но, похоже, он недоступен при использовании метода QueryOver.
Редактировать: я хочу получить список сайтов (объект верхнего уровня), отфильтрованных покритерии сайта, и каждый сайт должен иметь свой список событий, отфильтрованный по критериям события.
Я ожидаю, что он генерирует SQL, как показано ниже:
SELECT *
FROM [site] s
LEFT JOIN [event] e ON s.siteID = e.siteID
WHERE e.eventDate > @eventDate
AND (s.stateCd = @state OR s.stateName LIKE @state)