我的linq查询存在问题。
有两个表,Thread
和Post
。
它就像一个论坛。
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,但没有明确的帖子。
我错过了什么?
答案 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));
可能需要两个order-by语句,因为第一个将按时间对整个列表进行排序,第二个将确保在分组后仍然对项目进行排序。 SelectMany
将确保您收回所有帖子,而不是每个组一个。
通过测试,您可能会发现可能不需要第二个订单。这取决于在分组期间是否维持订单。 (我还没有检查过。)