Нужна помощь для сложного запроса SQL в NHibernate - PullRequest
0 голосов
/ 12 ноября 2009

Мне нужно знать, как я могу переписать следующий запрос SQL в формате ICibereria NHibernate. По сути, это способ имитировать функцию RANK () в MS-SQL и возвращать только те результаты, которые наиболее актуальны.

SELECT a.Name, a.Value, a.CreationDate
FROM MyTable a
WHERE EXISTS
(
  SELECT NULL
  FROM
  (
    SELECT TOP 1 CreationDate
    FROM MyTable
    WHERE Name = a.Name
    ORDER BY CreationDate DESC
  ) b
  WHERE b.CreationDate = a.CreationDate
)

Например, дана таблица со следующими данными:

ИМЯ, ЗНАЧЕНИЕ, CREATIONDATE
«Key One», «value one v1», «2009-11-11»
«Key One», «value one v2», «2009-11-12»
'Key Two', 'value two v1', '2009-11-09'
«Ключ три», «Значение три v2», «2009-09-09»
«Ключ три», «значение три v1», «2009-09-06»
«Ключ три», «Значение три v3», «2009-10-01»

Результатом вышеприведенного запроса будет:

'Key One', 'value one v2', '2009-11-12'
'Key Two', 'value two v1', '2009-11-09'
«Ключ три», «Значение три v3», «2009-10-01»

1 Ответ

0 голосов
/ 12 ноября 2009

Когда запрос сложный, не используйте «Criteria API», а «HQL», вы можете потерять много времени, чтобы найти правильное решение с «Criteria API». Показанный вами запрос практически можно использовать без изменений. Посмотрите на это: https://www.hibernate.org/hib_docs/nhibernate/html/queryhql.html

В конце, сгенерированный код, в общем, такой же, как "Criteria API" или "HQL" ...

кусок кода:

StringBuilder query = new StringBuilder();
query.Append("from MyTable where ");
query.Append("DateOfDayStart <= :startDate and DateOfDayEnd >= :endDate ");
IList<MyTable> list = session.CreateQuery(query.ToString())
    .SetDateTime("startDate", startDate)
    .SetDateTime("endDate", endDate)
    .List<MyTable>();
return list;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...