NHibernate QueryOver с maxResult, группировать по порядку

#nhibernate #queryover

#nhibernate #выполнение запроса

Вопрос:

Я пытаюсь преобразовать SQL-запрос в синтаксис NHibernate QueryOver, но я не понимаю, как сортировать по проекции count.

Вот как выглядит SQL-запрос:

 select top 10 v.intVoteUserID, COUNT(v.intVoteUserID)
from Group_MessageVotes v
where v.dtmVote > :date
group by v.intVoteUserID
order by COUNT(v.intVoteUserID) desc
  

Есть идеи?

Ответ №1:

Вы можете просто повторить проекцию в предложении OrderBy.

Следующий запрос выдаст вам IList<object[]> где первым элементом каждого элемента является идентификатор, а вторым — количество.

 var result = session.QueryOver<GroupMessageVotes>()
.Select(
    Projections.Group<GroupMessageVotes>(e => e.intVoteUserID),
    Projections.Count<GroupMessageVotes>(e => e.intVoteUserID)
    )
.OrderBy(Projections.Count<GroupMessageVotes>(e => e.intVoteUserID)).Desc
.Take(10)
.List<object[]>();
  

Комментарии:

1. Требуются ли все эти общие аргументы?

2. @Stefan Steinegger Я думаю, что они необходимы для лямбда-выражений. Вместо этого можно написать Projections.Count("intVoteUserID") , но я предпочитаю первый вариант.

3. Должно быть возможно записать Projections.Count(e => e.intVoteUserID) .

4. @Stefan Steinegger Да, вы правы. Забавно, что я этого раньше не видел. Я исправил свой ответ, чтобы учесть это.

5. Хм, подпись не совпадает. Это s учитывается(выражение<Функция<объект>> expression);` вместо Count<T>(Expression<Func<T, object>> expression);