我正在爲open source asp.net MVC-3 blog platform FunnelWeb構建ArchivesController
。我們有一個名爲「Entry」的模型,它表示一個博客條目,該條目發佈時具有名爲「發佈」的DateTime屬性。建議的ArchivesController
的目的是創建一個類似wordpress的檔案鏈接表,它顯示了所有年份和月份的降序列表,其中有我們的帖子鏈接到歸檔索引(如「/ archive/2011/9」),以及年/月的帖子數量。組/按日期年/月,用NHibernate部分選擇(投影?轉換?)
例如:
-
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.2.0.4000。
對不起Firo,這不起作用,只是因爲我想按日期的年份/月部分進行排序和分組。我得到Key的「無法解析屬性」異常。我認爲這將需要更多的「高級」NHibernate生成SQL MONTH(myDateColum)語句。 – BenSwayne