Как сделать несколько объединений с NHibernate Criteria API - PullRequest
5 голосов
/ 05 сентября 2011

У меня есть следующая модель данных:

Page
- Id      // Pk
- Type    // int

Section
- Id      // Pk
- Page    // Fk

Comment
- Id      // Pk
- Section // Fk
- Date    // DateTime

Я пытаюсь запросить все комментарии, связанные с определенной страницей (например, page.id = 2 и page.Type = 1) в течение определенного времени. Я попробовал это так:

   var criteria = session.CreateCriteria<Comment>()

   .Add(Restrictions.Eq("Section.Page.Id", pageId))
   .Add(Restrictions.Eq("Section.Page.Type", pageType))
   .Add(Restrictions.Ge("Date", start))
   .Add(Restrictions.Lt("Date", end));

Однако, это терпит неудачу, поскольку я получаю сообщение об ошибке «Не удалось разрешить свойство: Страница из: TestNamespace.Comment» Обычно это указывает на ошибки отображения, но работает во всех других случаях, поэтому я склонен полагать, что ошибка заключается в запросе.

Что еще хуже, Comment.Section в некоторых случаях может быть нулевым (есть комментарии, которые не связаны ни с разделом, ни со страницей). В этом случае я хочу игнорировать эти комментарии.

Любой совет?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 06 сентября 2011
  var criteria = session.CreateCriteria<Comment>()
     .CreateAlias("Section", "section")
     .CreateAlias("section.Page", "page")
     .Add(Restrictions.Eq("page.Id", pageId))
     .Add(Restrictions.Eq("page.Type", pageType))
     .Add(Restrictions.Ge("Date", start))
     .Add(Restrictions.Lt("Date", end));

Я обновил код на основе вашего комментария. Специально добавлена ​​2-я строка, а 3-я строка использует псевдоним во 2-й строке вместо свойства и т. Д.

0 голосов
/ 25 октября 2011

Вы можете использовать дополнительные вызовы CreateCriteria для навигации по структуре базы данных

var criteria = session.CreateCriteria<Comment>()
               .Add(Restrictions.Ge("Date", start))
               .Add(Restrictions.Lt("Date", end))
               .CreateCriteria("Section")
               .CreateCriteria("Page")
               .Add(Restrictions.Eq("Id", pageId))
               .Add(Restrictions.Eq("Type", pageType));
...