Запрос критериев NHibernate: работа с разделами

Я только начал изучать запросы NHibernate Criteria. Теперь займемся этой проблемой таблицы соединения и разбиения.

Справочная информация:

1. две объектные модели:

Проект, Пользователь

2.Свойства модели:

Проект:

  • ID (целое)
  • UpdateDate (DateTime)
  • Статус (строка)
  • Пользователь (Пользователь)

Пользователь:

  • ID (целое)
  • Имя (строка)

3. отношения

Один проект обновляется пользователем за раз, после каждого обновления будет создан новый экземпляр проекта с текущими UpdateDate, Status, User.

Что я хочу делать:

  1. Группируйте проекты по User.ID

  2. Заказ по UpdateDate

  3. Получите первую запись каждой группы из 1 и 2

  4. Убедитесь, что статус этого проекта! = "Удален"

  5. Если 4 пройдено, то поместить этот проект в список результатов.

Проблема:

  1. В данный момент я ограничен в использовании критериев
  2. Я умею делать простые запросы, например:

    ICriteria projectCriteria = Session.CreateCriteria ();

    projectCriteria.Add (Restrictions.Not ("Статус", "Удалено"));

    projectCriteria.AddOrder (Order.Desc ("UpdateDate"));

но с трудом справляются с разделами и объединениями таблиц с использованием Criteria API.

интересно, может ли мне помочь кто-нибудь, кто знает, как это сделать.

Благодарность!

SQL-запрос, который я пробовал в базе данных:

WITH PartitionProject AS 
(
    SELECT   *, ROW_NUMBER() OVER(PARTITION BY UserFk ORDER BY UpdateDate DESC) AS RowNumber
    FROM     Projects
)
SELECT * 
FROM PartitionProject 
WHERE RowNumber = 1 and (ProjectStatus != 'Deleted')

person Simon    schedule 01.03.2013    source источник
comment
если вы напишете sql-запрос, который хотите перевести, я могу привести пример   -  person giammin    schedule 02.03.2013
comment
Добавлен SQL. Спасибо за внимание.   -  person Simon    schedule 02.03.2013


Ответы (1)


Я думаю, что Nhibernate не поддерживает раздел Row_Number (), но вы можете использовать Projections.SqlProjection

Вы можете обработать свой запрос, разделив его на 2 этапа:

запрос первого шага к базе данных с использованием Projection.SqlProjection, который возвращает список объектов

второй шаг - повторить этот список, чтобы извлечь то, что вам нужно

person giammin    schedule 02.03.2013