2011-12-04 65 views
1

我正在爲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和經驗所以使用這樣寫了初始查詢:

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。

回答

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提供者和發佈錯誤?

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

對不起Firo,這不起作用,只是因爲我想按日期的年份/月部分進行排序和分組。我得到Key的「無法解析屬性」異常。我認爲這將需要更多的「高級」NHibernate生成SQL MONTH(myDateColum)語句。 – BenSwayne

相關問題