Как написать следующий SQL-запрос в NHibernate

#sql #nhibernate #icriteria

#sql #nhibernate #критерии

Вопрос:

Привет — я пытаюсь выяснить, как написать следующее, используя NHibernate ICriteria (несколько критериев?) для следующего:

(Это запрос для получения списка имен, упорядоченных по популярности в таблице за последний день)

 select firstname,count(firstname) as occurances from registrants
where timestamp between DateAdd(day,-1, GetDate()) and getdate()
group by firstname
order by count(firstname) desc 
  

Кроме того, учитывая, что это всего лишь пара столбцов из таблицы, исключая идентификатор, и NHibernate нужны идентификаторы для своих объектов, какой самый простой способ «подделать» идентификатор, чтобы я мог просто получить результаты?

Ответ №1:

Для этого вам нужно использовать проекции и трансформатор. Вот некоторая справочная информация http://nhibernate.info/doc/nh/en/index.html#querycriteria-projection

 var criteria = Session.CreateCriteria<Registrant>()
   .Add(Restrictions.Between("Timestamp", DateTime.Now.AddDays(-1), DateTime.Now)
   .AddOrder(Order.Desc(Projections.Count("FirstName")))
   .SetProjection(Projections.ProjectionList()
        .Add(Projections.GroupProperty("FirstName"), "FirstName")
        .Add(Projections.Count("FirstName"), "Occurances")
   .SetResultTransformer(Transformers.AliasToBean<FirstNameOccurance>());

criteria.List<FirstNameOccurance>();
  

Вам нужно будет создать класс с именем FirstNameOccurence, который имеет 2 свойства, называемые FirstName и Occurances.

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

1. Большое спасибо, Вадим, великолепно — работает как шарм. Мне нужно изучить NHibernate!