#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!