Группировать / сортировать по дате Год / месяц, частичный выбор с помощью NHibernate (проекция? Преобразование?) - PullRequest
1 голос
/ 04 декабря 2011

Я создаю ArchivesController для открытого исходного кода asp.net. Блог-платформа MVC-3 FunnelWeb .У нас есть модель под названием «Entry», которая представляет запись в блоге, которая имеет свойство DateTime, которое называется «Опубликовано», когда эта запись была опубликована.Цель предлагаемого ArchivesController состоит в том, чтобы создать таблицу ссылок на архивы в стиле wordpress, которая показывает нисходящий список всех лет и месяцев, для которых у нас есть сообщения со ссылками на индекс архива, например '/ archive / 2011/9', иколичество сообщений в году / месяце.

ex:

  • Декабрь 2011 (2 сообщения)
  • Ноябрь 2011 (4 сообщения)
  • Октябрь 2011 (1 запись)

Я не имел опыта работы с NHibernate и поэтому написал первоначальный запрос, используя , например:

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.

1 Ответ

0 голосов
/ 05 декабря 2011

Обновление:

var query = from e in session.Query<Entry>()
            group e by new { e.Published.Year, e.Published.Month } into entryGroup
            select new
            {
                entryGroup.First().Published,
                EntryCount = entryGroup.Count()
            };

var archiveDates = from a in query.AsEnumerable()
                   orderby a.Published.Year descending, a.Published.Month descending
                   select new
                   {
                       Year = a.Published.Year,
                       Month = a.Published.Month,
                       EntryCount = a.EntryCount,
                   };

Оригинальный ответ:

не могли бы вы сначала попробовать LINQ-провайдера NHibernates и опубликовать ошибки?

using NHibernate.Linq;


var archiveDates = from entry in session.Query<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()
                   };
...