1

我正在ArchivesController开源 asp.net MVC-3 博客平台 FunnelWeb 构建一个。我们有一个名为“Entry”的模型,它表示一个博客条目,该条目具有一个名为“Published”的 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# 中进行分组和排序。我想在一个已经存在了几年的活跃博客上,有成百上千的帖子会更好,在 SQL 中执行此操作会更好,这样我们就不会返回不必要的数据(如条目内容)。

我的问题是我们如何以 NHibernate 方式完成上述 LINQ 语句,从而导致在 SQL 中发生分组/排序。我想它会涉及一些标准->投影->转换之类的过程。

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

博客引擎使用 NHibernate 版本 3.2.0.4000。

4

1 回答 1

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()
                   };
于 2011-12-05T09:06:19.220 回答