【问题标题】:Order by child property in list按列表中的子属性排序
【发布时间】:2024-04-30 04:35:02
【问题描述】:

我有两个表 - 博客和帖子(一对多关系)。

我想获取所有至少 3 个博客,并且在发布日期之前只为博客和订单列表发布 3 个帖子。

我在尝试什么:

_context.Blogs.Where(x => x.IsActive && x.Posts.Count >= 3).OrderByDescending(p => p.Posts.OrderByDescending(x => x.PublishDate)).ToList();

但我收到一条错误消息:

ArgumentException: At least one object must implement IComparable.

更新:

好的,我知道按发布日期排序会有问题。 我也在博客表 LastBuildDate 属性中。那么如何按 LastBuildDate 订购呢?

【问题讨论】:

  • 包含帖子表
  • 这不是意味着您应该首先按博客排序,然后在显示帖子时按发布日期排序吗?您可以将 Blog 扩展为 PostedAt ,它指的是第一个帖子,因此您可以在博客上排序,然后在显示帖子的位置,对帖子进行排序...
  • 我的 linq 有点生疏了,但它怎么知道用什么来订购博客?在我看来,在博客排序中排序帖子不一定正确?
  • vlog 有帖子,所以我想在帖子发布日期之前订购博客。
  • 但您刚才说您有多个帖子,每个帖子都有一个发布日期。它如何知道要订购哪个帖子的发布日期..

标签: c# .net asp.net-mvc entity-framework linq


【解决方案1】:

嵌套排序是这样的:

.OrderByDescending(p => p.Posts.OrderByDescending(x => x.PublishDate))

外部顺序是评估 Posts 属性所在的对象,它没有实现 IComparable。例如,如果你这样做了:

.OrderByDescending(p => p.Posts.Max(x => x.PublishDate))

Max 返回一个日期时间。但是,帖子上的 OrderbyDescending 会返回无法在此处评估的内容...

【讨论】:

    【解决方案2】:

    试试这个,我还没有测试过。

    _context.Blogs.Where(x => x.IsActive && x.Posts.Count >= 3).OrderByDescending(x => x.LastBuildDate).ToList();
    

    【讨论】:

    • 我的 linq 非常生锈:-/ 尝试删除 OrderByDescending() 中的所有内容,我很确定你可以做到。