オープン ソースの asp.net MVC-3 ブログ プラットフォーム FunnelWebを構築しArchivesController
ています。このエントリが公開されたときの「Published」という DateTime プロパティを持つブログ エントリを表す「Entry」というモデルがあります。提案の目的は、'/archive/2011/9' のようなアーカイブ インデックスへのリンクと、年月の投稿数。ArchivesController
元:
- 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
このクエリからの年月カウント情報をカプセル化するために作成した新しいモデルはどこにありますか。
これは機能しますが、C# でグループ化と並べ替えを行うのではなく、作業を SQL にプッシュすることをお勧めします。数百または数千の投稿があるアクティブなブログでは、不要なデータ (エントリ コンテンツなど) を返さないように、SQL でこれを行う方がはるかに優れていると思います。
私の質問は、上記の LINQ ステートメントを NHibernate の方法で実現する方法です。これにより、SQL でグループ化/並べ替えが行われます。いくつかの基準 - >投影 - >変換のようなプロセスが含まれると思います。
私が立ち往生している部分は、.Net DateTime オブジェクトによって現在アクセスされているグループ化と並べ替えのために、DateTime プロパティの月部分と年部分にアクセスすることです。
ブログ エンジンは NHibernate バージョン 3.2.0.4000 を使用しています。