2013-04-20 106 views
1

我對Linq相當陌生,因此對我來說很簡單。我正在創建一個博客網站,而不是使用罐裝解決方案,並且使用MVC 3構建它。我有一個按年顯示帖子的存檔頁面。在存儲庫中,代碼是:需要訂購使用Linq

IEnumerable<IGrouping<int, Post>> groupedPosts = _dataContext.Posts 
      .GroupBy(s => s.PostDate.Year) 
      .OrderByDescending(p => p.Key).ToList(); 

正如您所看到的,我正在列出帖子並按年份對它們進行分組。這種情況下的關鍵當然是今年。在視圖中,我循環收集並正確顯示所有內容。但是,我注意到,當我插入新帖子時,由於我按年訂購,組中的新帖子被置於底部並且過時。例如,插入一個職位2013年4月20日之後,存檔顯示以下內容: -

2013 
Aha, I'm back 
Posted: 15 April 2013 
Aha, I'm back 
Posted: 07 April 2013 
Thinking Too Much 
Posted: 02 March 2013 
Blog 2 Title Category XHTML 
Posted: 02 February 2013 
Latest Blog Post 
Posted: 20 April 2013 

見我的最新帖子是如何放置在堆的底部時,它應該是在每個分組的頂部。我知道我需要以某種方式訂購帖子,但不知道如何做到這一點。是否有一種簡單的方法可以在每個組中排列帖子,因此最新的帖子被放置在每個組的頂部。感謝您的幫助。

回答

1
IEnumerable<IGrouping<int, Post>> groupedPosts = _dataContext.Posts 
    .AsEnumerable() //we're pulling the whole table, might as well make it official. 
    .OrderByDescending(s => s.PostDate) 
    .GroupBy(s => s.PostDate.Year) //Enumerable.GroupBy retains the order in the groups 
    .OrderByDescending(g => g.Key) 
    .ToList(); 
+0

Arghhh。我知道這會是如此簡單,但我無法看到樹林裏的樹林。作品絕對發現。爲那個戴夫歡呼 – 2013-04-21 10:19:23

1

您應該兩次 - 每個組內的物品,和第二羣體:

var groupedPosts = _dataContext.Posts 
      .GroupBy(s => s.PostDate.Year) 
      .OrderByDescending(p => p.Key) 
      .Select(g = new { g.Key, Items = g.OrderByDescending(x => x.PostDate) }) 
      .ToList(); 
+0

我都試過,但編譯器堅持我轉換爲不同的類型。特別是,我得到以下警告消息: - 不能隱式轉換類型'System.Collections.Generic.List >'到'System.Collections.Generic.IEnumerable >」。存在明確的轉換(您是否缺少演員?)。如果我執行這個轉換,我不能再訪問視圖中的key屬性。 – 2013-04-20 21:32:12

+0

將變量聲明更改爲隱式'var'並使用匿名類型。 – MarcinJuraszek 2013-04-20 21:32:46

+0

我也試過這個。我實際上爲此創建了一個特定的視圖模型,所以我可以將值映射到整個視圖。視圖模型中的屬性是年份,標題,日期。然而,這意味着,不是打印出一年,然後是下面分組的帖子,然後是另一年等,每一個我不想要的帖子打印一年。我曾想過解決方法,但這意味着在視圖中添加複雜的邏輯,我認爲這不是最佳實踐。 – 2013-04-20 21:36:56