1

オープン ソースの asp.net MVC-3 ブログ プラットフォーム FunnelWebを構築しArchivesControllerています。このエントリが公開されたときの「Published」という DateTime プロパティを持つブログ エントリを表す「Entry」というモデルがあります。提案の目的は、'/archive/2011/9' のようなアーカイブ インデックスへのリンクと、年月の投稿数。ArchivesController

元:

  • 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このクエリからの年月カウント情報をカプセル化するために作成した新しいモデルはどこにありますか。

これは機能しますが、C# でグループ化と並べ替えを行うのではなく、作業を SQL にプッシュすることをお勧めします。数百または数千の投稿があるアクティブなブログでは、不要なデータ (エントリ コンテンツなど) を返さないように、SQL でこれを行う方がはるかに優れていると思います。

私の質問は、上記の LINQ ステートメントを NHibernate の方法で実現する方法です。これにより、SQL でグループ化/並べ替えが行われます。いくつかの基準 - >投影 - >変換のようなプロセスが含まれると思います。

私が立ち往生している部分は、.Net DateTime オブジェクトによって現在アクセスされているグループ化と並べ替えのために、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 に答える