OrderBy GroupBy使用Linq

时间:2015-01-24 00:08:57

标签: c# linq distinct

我的linq查询存在问题。 有两个表,ThreadPost。 它就像一个论坛。

public class Post
{
    public int PostID { get; set; }
    public int ThreadID { get; set; }
    public DateTime Time { get; set; }

    public virtual Thread Thread { get; set; }
}

public class Thread
{
    public int ThreadID { get; set; }
    public string Title { get; set; }

    public virtual ICollection<Post> Posts { get; set; }
}

Threads:
"1, Thread A"
"2, Thread B"

Posts:
"1, 1, 01.01.15"
"2, 1, 02.01.15"
"3, 1, 03.01.15"
"4, 2, 01.01.15"

Expected result:
"3, 1, 03.01.15"
"4, 2, 01.01.15"

我希望按ThreadID分组所有帖子,但我希望使用Time按最新帖子排序。

这是我的疑问。

Posts.OrderByDescending(x => x.Time).GroupBy(x => x.ThreadID).Select(x => x.FirstOrDefault());

这会返回不同的帖子,但会找到最旧的帖子,而不是最新的帖子。

如果我使用此代码。

Posts.OrderByDescending(x => x.Time)

我得到了排序corerct,但没有明确的帖子。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

如果您想要每个帖子中的最新帖子,请尝试:

Posts.GroupBy(x => x.ThreadID)
     .Select(x => x.OrderByDescending(y => y.Time).FirstOrDefault())
     .OrderByDescending(x => x.Time);

如果你想要所有帖子,按线程分组,按照帖子中最新帖子的顺序排列,那么试试这个:

Posts.OrderByDescending(x => x.Time)
     .GroupBy(x => x.ThreadID)
     .SelectMany(x => x.OrderByDescending(y => y.Time));

可能需要两个ord​​er-by语句,因为第一个将按时间对整个列表进行排序,第二个将确保在分组后仍然对项目进行排序。 SelectMany将确保您收回所有帖子,而不是每个组一个。

通过测试,您可能会发现可能不需要第二个订单。这取决于在分组期间是否维持订单。 (我还没有检查过。)