需要订购使用Linq

时间:2013-04-20 21:18:11

标签: asp.net-mvc-3 linq

我对Linq很新,所以对我很轻松。我正在创建一个博客网站,而不是使用固定解决方案,我正在使用MVC 3构建它。我有一个存档页面,按年显示帖子。在存储库中,代码是:

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

当它应该位于每个分组的顶部时,查看我的最新帖子是如何放置在堆的底部的。我知道我需要以某种方式订购这些帖子,但我不知道该怎么做。有没有一种简单的方法可以在每个组中订购帖子,因此最新的帖子放在每个组的顶部。谢谢你的帮助。

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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();