#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);