Я создаю ArchivesController
для открытого исходного кода asp.net. Блог-платформа MVC-3 FunnelWeb .У нас есть модель под названием «Entry», которая представляет запись в блоге, которая имеет свойство DateTime, которое называется «Опубликовано», когда эта запись была опубликована.Цель предлагаемого ArchivesController
состоит в том, чтобы создать таблицу ссылок на архивы в стиле wordpress, которая показывает нисходящий список всех лет и месяцев, для которых у нас есть сообщения со ссылками на индекс архива, например '/ archive / 2011/9', иколичество сообщений в году / месяце.
ex:
- Декабрь 2011 (2 сообщения)
- Ноябрь 2011 (4 сообщения)
- Октябрь 2011 (1 запись)
Я не имел опыта работы с NHibernate и поэтому написал первоначальный запрос, используя linq , например:
public class GetArchiveDatesQuery : IQuery<ArchiveDate>
{
public System.Collections.Generic.IEnumerable<ArchiveDate> Execute(ISession session, IDatabaseProvider databaseProvider)
{
var criteria = session.QueryOver<Entry>();
var archiveDates = from entry in criteria.List<Entry>()
group entry by new { entry.Published.Year, entry.Published.Month } into entryGroup
orderby entryGroup.Key.Year descending, entryGroup.Key.Month descending
select new ArchiveDate()
{
Year = entryGroup.Key.Year,
Month = entryGroup.Key.Month,
EntryCount = entryGroup.Count()
};
return archiveDates;
}
}
Где ArchiveDate
- это новая модель, которую я создал для инкапсуляции информации о количестве месяцев и месяцев из этого запроса.
Это работает, но я бы предпочел перенести работу на SQL, а не группироватьи сортировка в C #.Я полагаю, что для активного блога, который существует уже несколько лет с сотнями или тысячами постов, было бы гораздо лучше сделать это в SQL, чтобы мы не возвращали ненужные данные (например, содержимое записей).
Мой вопрос заключается в том, как мы можем выполнить вышеупомянутое выражение LINQ способом NHibernate, что приводит к группированию / сортировке, происходящей в SQL.Я предполагаю, что это потребует некоторого процесса Criteria-> Projection-> Transformation.
Часть, на которой я застрял, получает доступ к части месяца и части свойства DateTime для группировки и сортировки, к которой в данный момент осуществляется доступ.объектом .Net DateTime.
Механизм блога использует NHibernate версии 3.2.0.4000.