EF Core 5能否按未选中的列执行Order By排序?
EF Core 5使用未出现在投影列表的字段排序的实现方法
EF Core 5本身完全支持该操作,你遇到的限制是因为查询方法的调用顺序错误导致的。
正确实现方式
只要将.OrderBy()方法的调用放在.Select()投影操作之前即可,示例代码如下:
var memberList = await _dbContext.Members // 先调用OrderBy,可使用实体的任意字段排序,不受后续投影逻辑影响 .OrderBy(m => m.CreatedDate) // 再执行投影,仅选择需要返回的字段 .Select(m => new { m.FirstName, m.SecondName }) .ToListAsync();
上述代码生成的SQL和你给出的原生SQL完全一致:
SELECT FirstName, SecondName FROM Members ORDER BY CreatedDate
错误原因说明
如果你将.OrderBy()放在.Select()之后,此时你操作的对象已经是投影后的匿名类或者自定义DTO对象,该类型中不存在CreatedDate字段,自然无法调用该字段排序,这是C#强类型语法的正常限制,并非EF Core的功能缺陷。
特殊场景处理
如果你的业务逻辑必须先执行投影操作,可以在首次投影时临时包含排序字段,排序完成后再做二次投影剔除该字段即可,示例如下:
var memberList = await _dbContext.Members .Select(m => new { m.FirstName, m.SecondName, m.CreatedDate // 临时包含排序字段 }) .OrderBy(temp => temp.CreatedDate) // 二次投影剔除不需要的排序字段 .Select(temp => new { temp.FirstName, temp.SecondName }) .ToListAsync();
该写法最终生成的SQL和之前的实现完全相同,不会产生额外的性能开销。
内容的提问来源于stack exchange,提问作者Paul McCarthy
相关产品推荐
相关产品推荐

