【问题标题】:OrderBy IQueryable list based on another inner list in LINQ [duplicate]OrderBy IQueryable 列表基于 LINQ 中的另一个内部列表 [重复]
【发布时间】:2022-01-16 19:46:52
【问题描述】:

我使用的是 EF Core 2.2.6 版。

我想使用IQueryable根据内部列表对列表进行降序排序。

我有一个课程列表,每个课程都有一个课程进度列表,我想根据内部列表课程进度'UpdatedDate订购课程列表。

我在对数据库执行之前以编程方式构建 LINQ 查询。

代码如下

IQueryable<Course> query = _dbContext
                                .Courses
                                .AsNoTracking()
                                .Include(x => x.CourseProgresses)

if (page > 0 && pageSize > 0)
    query = query.Skip((page - 1) * pageSize)
                 .Take(pageSize);

if (watched == false)
{
    query = query.OrderByDescending(x => x.LastUpdatedAt);
}
else
{
    // TODO: THIS IS THE PART I NEED TO FIX
    query = query.OrderByDescending(x => x.CourseProgresses.OrderByDescending(y => y.UpdateDate));
}
             
var courses = await query.ToListAsync();

当执行带有查询的行时

query = query.OrderByDescending(x => x.CourseProgresses.OrderByDescending(y => y.UpdateDate));

在尝试制作ToListAsync 之后,我收到如下错误:

比较数组中的两个元素失败。

至少一个对象必须实现 IComparable。

我看到另一篇文章解释了如何使用.Sort 进行操作,但问题是我需要使用List,而不是IQueryable,有人有解决此问题的方法吗?

【问题讨论】:

  • 它没有,在你提到的问题中只显示一个元素,我需要一个元素列表(在我的情况下是当然)作为返回值
  • 不,当我添加您提到的代码时,我仍然没有收到异常: query = query.Include(x => x.CourseProgresses.OrderByDescending(y => y.UpdateDate)) ;
  • 异常:包含属性 lambda 表达式 'x => {from CourseProgress y in x.CourseProgresses orderby [y].UpdateDate desc select [y]}' 无效。该表达式应表示属性访问:'t => t.MyProperty'。要定位在派生类型上声明的导航,请指定目标类型的显式类型 lambda 参数,例如'(Derived d) => d.MyProperty'.
  • 能否在问题中包含使用过的 EF 版本?
  • 这不是一个正确的问题.. 我们不知道CoursesCourseProgresses 之间的关系是什么

标签: c# .net entity-framework linq


【解决方案1】:

如果你想按嵌套元素排序,你可以这样做:

query = query.OrderByDescending(x => 
    {
        x.CourseProgresses = x.CourseProgresses.OrderByDescending(y => y.UpdateDate));
        return x.Id;
    }

【讨论】:

  • 感谢您的回答,但它抱怨 x.CourseProgresses.OrderByDescending(y => y.UpdateDate)) 部分:无法从 IOrderedEnumerable 转换为 ICollection。我之前尝试过类似的东西,但我最终遇到了同样的错误
  • 也许这个问题会对你有所帮助:stackoverflow.com/questions/18853573/…
  • 您好 Sebastian,非常感谢您的推荐,但是在检查您指出的这个答案时,我遇到了投射错误。 PS:你能帮我重新打开这个问题吗?不幸的是,有人对所有内容都投了反对票并试图关闭它。
猜你喜欢
  • 1970-01-01
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 2017-10-21
相关资源
最近更新 更多