组/排序日期年/月,部分选择与NHibernate(投影?转换?)

本文关键字:NHibernate 投影 转换 选择 日期 排序 | 更新日期: 2023-09-27 18:16:38

我正在为开源的asp.net MVC-3博客平台FunnelWeb构建ArchivesController。我们有一个名为"Entry"的模型,它表示一个博客条目,该条目具有一个名为"Published"的DateTime属性,用于表示该条目的发布时间。提议的ArchivesController的目的是创建一个类似wordpress的存档链接表,该表显示所有年份和月份的降序列表,其中我们有链接到存档索引(如'/archive/2011/9')的帖子,并计算该年/月的帖子数量。

,

  • 2011年12月(2篇)
  • 2011年11月(4篇)
  • 2011年10月(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来做会更好,这样我们就不会返回不必要的数据(比如条目内容)。

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

我卡住的部分是访问DateTime属性的月部分和年部分,用于分组和排序,目前由。net DateTime对象访问。

博客引擎使用的是NHibernate版本3.0.4000

组/排序日期年/月,部分选择与NHibernate(投影?转换?)

更新:

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