使用 Linq 的 OrderBy GroupBy

OrderBy GroupBy using Linq

我的 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 对所有 post 进行分组,但我希望使用 Time.[=17 按最新的 post 对其进行排序=]

这是我的查询。

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

这 return 个不同的 post,但它找到最旧的 post,而不是最新的。

如果我使用这个代码。

Posts.OrderByDescending(x => x.Time)

我得到了正确的排序,但不是不同的 posts。

我错过了什么?

如果你想要每个线程中的最新 post,试试这个:

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

如果你想要 all posts,按线程分组,按照线程中最新 post 的顺序,然后试试这个:

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

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

通过测试,您可能会发现可能不需要二次排序。这仅取决于分组期间是否保持顺序。 (我没查过)