OrderBy IQueryable 列表基于 LINQ 中的另一个内部列表 [重复]

Posted

技术标签:

【中文标题】OrderBy IQueryable 列表基于 LINQ 中的另一个内部列表 [重复]【英文标题】:OrderBy IQueryable list based on another inner list in LINQ [duplicate] 【发布时间】: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 之间的关系是什么 【参考方案1】:

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

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

【讨论】:

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

以上是关于OrderBy IQueryable 列表基于 LINQ 中的另一个内部列表 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

查找一个列表中具有与另一个对象列表中的属性匹配的属性的所有对象

spark数据框中orderBy的列列表

我正在寻找一种从字符串构建 IQueryable 查询的方法

无法将类型“IQueryable”隐式转换为 Generic.IList' 从 EF 上下文中检索记录列表作为列表

为啥我不能像使用列表一样过滤 IQueryable?

返回列表而不是IQueryable