Linq 按 parent 和 child 排序
Linq order by parent and child
我有两个表:反馈和评论。一个反馈可以有很多评论。基本上是一个简单的 parent child 关系。
我有一个页面可以列出所有反馈和相关评论,如下所示:
Feedback A
Comment A1
Comment A2
Feedback B
Comment B1
Feedback C (note: no comments)
每条反馈和评论都有一个创建日期。目前我按反馈日期排序,然后是评论日期,所以我总是在顶部有最新的反馈,然后是所有评论。
我想要实现的是:当一个新的评论被添加到一个反馈时,这个反馈应该显示在顶部,无论反馈有多旧,或者如果一个反馈被添加而没有评论这个反馈应该现在成为列表中的第一项。假设在反馈 B 中添加了评论,然后添加了没有评论的新反馈,那么我的列表将如下所示:
Feedback D (this is the new feedback)
Feedback B
Comment B1
Comment B2 (this is the new comment)
Feedback A
Comment A1
Comment A2
Feedback C (note: no comments)
现在反馈 D 将位于列表的顶部,因为它具有所有反馈和评论的最新日期,而反馈 B 将排在第二位,因为它具有评论 B2,其具有第二个最新日期。
到目前为止,这是我的代码:
_repositories.Feedback
.Include(f => f.Comments)
.OrderByDescending(f => f.PublishedDate);
我想修改
.OrderByDescending(f => f.PublishedDate)
以获得正确的顺序。这可能吗?
Select 每个反馈的最后评论日期并按它们排序:
_repositories.Feedback
.Include(f => f.Comments)
.OrderByDescending(f =>
f.Comments
.Select(c => (DateTime?)c.PublishedDate)
.OrderByDescending(c => c)
.FirstOrDefault() ?? f.PublishedDate
)
.ThenByDescending(f => f.PublishedDate);
我有两个表:反馈和评论。一个反馈可以有很多评论。基本上是一个简单的 parent child 关系。
我有一个页面可以列出所有反馈和相关评论,如下所示:
Feedback A Comment A1 Comment A2 Feedback B Comment B1 Feedback C (note: no comments)
每条反馈和评论都有一个创建日期。目前我按反馈日期排序,然后是评论日期,所以我总是在顶部有最新的反馈,然后是所有评论。
我想要实现的是:当一个新的评论被添加到一个反馈时,这个反馈应该显示在顶部,无论反馈有多旧,或者如果一个反馈被添加而没有评论这个反馈应该现在成为列表中的第一项。假设在反馈 B 中添加了评论,然后添加了没有评论的新反馈,那么我的列表将如下所示:
Feedback D (this is the new feedback) Feedback B Comment B1 Comment B2 (this is the new comment) Feedback A Comment A1 Comment A2 Feedback C (note: no comments)
现在反馈 D 将位于列表的顶部,因为它具有所有反馈和评论的最新日期,而反馈 B 将排在第二位,因为它具有评论 B2,其具有第二个最新日期。
到目前为止,这是我的代码:
_repositories.Feedback
.Include(f => f.Comments)
.OrderByDescending(f => f.PublishedDate);
我想修改
.OrderByDescending(f => f.PublishedDate)以获得正确的顺序。这可能吗?
Select 每个反馈的最后评论日期并按它们排序:
_repositories.Feedback
.Include(f => f.Comments)
.OrderByDescending(f =>
f.Comments
.Select(c => (DateTime?)c.PublishedDate)
.OrderByDescending(c => c)
.FirstOrDefault() ?? f.PublishedDate
)
.ThenByDescending(f => f.PublishedDate);