按日期分组/排序年/月,使用NHibernate进行部分选择(投影?转换?)

时间:2011-12-04 18:26:44

标签: c# linq asp.net-mvc-3 nhibernate funnelweb

我正为open source asp.net MVC-3 blog platform FunnelWeb建立ArchivesController。我们有一个名为“Entry”的模型,它代表一个博客条目,该条目在发布此条目时具有名为“已发布”的DateTime属性。建议ArchivesController的目的是创建一个类似wordpress的档案链接表,其中显示了我们所有年份和月份的下降列表,其中包含指向档案索引的链接,例如'/ archive / 2011/9'并计算年/月的职位数。

例如:

  • 2011年12月(2个帖子)
  • 2011年11月(4个帖子)
  • 2011年10月(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#中进行分组和排序。我想在一个活跃的博客上已经存在了数百或数千个帖子已经存在好几年,这样做会更好,所以我们不会返回不必要的数据(比如条目内容)。

我的问题是如何以NHibernate方式完成上述LINQ语句,从而导致在SQL中进行分组/排序。我想它将涉及一些Criteria-&gt; Projection-&gt; Transformation类型的过程。

我坚持使用的部分是访问DateTime属性的月份部分和年份部分,用于分组和排序,当前由.Net DateTime对象访问。

博客引擎正在使用NHibernate版本3.2.0.4000。

1 个答案:

答案 0 :(得分:0)

更新

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,
                   };

原始答案:

你可以先试试NHibernates LINQ-provider并发布错误吗?

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()
                   };