Entity Framework中使用Select扩展方法配合OrderBy报错的问题咨询
问题解析与修复方案
首先直接给结论:Select并不是不能和OrderBy一起用,你遇到的错误是因为排序表达式返回了一个集合类型,而SQL无法对集合进行排序判断。
错误原因拆解
你的排序代码OrderBy(x => x.Actions.Select(y => y.Id))中,x.Actions.Select(...)会返回一个IEnumerable<int>(员工关联的所有Action的Id集合)。SQL的排序逻辑要求排序键必须是单个可比较的标量值(比如整数、字符串、日期等),它没办法判断一个集合"大于"或"小于"另一个集合,所以才抛出了DbSortClause expressions must have a type that is order comparable这个异常。
可行的修复方案
你需要明确基于集合中的哪个具体值来排序,常见的几种场景:
- 按关联Action Id的最小值排序:
context.Employees .Where(x => x.Actions.Any(y => y.Id == 1)) .OrderBy(x => x.Actions.Min(y => y.Id)) .First(); - 按关联Action Id的最大值排序:
context.Employees .Where(x => x.Actions.Any(y => y.Id == 1)) .OrderBy(x => x.Actions.Max(y => y.Id)) .First(); - 如果你的业务逻辑是想基于筛选条件中指定的
Id=1这个值排序(不过这里Where已经过滤出包含该Action的员工,所以这个排序键是固定的,实际意义不大):context.Employees .Where(x => x.Actions.Any(y => y.Id == 1)) .OrderBy(x => x.Actions.First(y => y.Id == 1).Id) .First();
额外说明
Select和OrderBy完全可以配合使用,但前提是Select返回的是单个标量值,而不是集合。比如OrderBy(x => x.Name.Substring(0, 1))是合法的——因为Substring返回单个字符串,属于可比较类型;但返回集合的Select就不适合作为OrderBy的参数。
内容的提问来源于stack exchange,提问作者Sisyphus
相关产品推荐
相关产品推荐

