先解释一下这个标题的意思,OrderBy 在 Linq 语句中,我们经常使用,比如 OrderBy(b => b.BlogId) 就是对 BlogId 字段进行升序排序,这是针对一个字段的排序,如果多个字段排序,我们可以使用 ThenBy,或者直接在 OrderBy 中对多个字段进行逗号分割,但有一种场景是,我们要对 OrderBy 增加计算功能,什么意思呢?看一段 SQL 代码:

SELECT [b].[BlogCateId], [b].[BlogId], [b].[Url]
FROM [Blog] AS [b]
ORDER BY ([b].[BlogId] * 2 + [b].[BlogCateId])
OFFSET 0 ROWS FETCH NEXT 100 ROWS ONLY

这篇博文的主题,其实就是如何用 Linq 翻译这段 SQL 代码,上面这段代码在 SQL Server 中执行没有任何问题,有人说了,很简单啊,比如翻译后的一段代码:

[Fact]
public void ContextLoad_Test()
{using (var context = new BloggingContext()){var query = from b in context.Blogsorderby  b.BlogId * 2 + b.BlogCateIdselect b;var result = query.Skip(0).Take(100).ToList();}
}

没错,最“直白”的翻译就是这样的,但测试运行后会抛出异常:

异常信息:A query containing the Skip operator must include at least one OrderBy operation.

这段异常信息大概是说使用 Skip 包含至少一个 OrderBy,也就是说我们上面使用 orderby b.BlogId * 2 + b.BlogCateId + 34,这段代码并没有起到什么效果,或者说 EF 没有识别出来,总的来说我们这些翻译的 Linq 语句是错误的,但很奇怪的是,我使用 Google 搜索这段异常信息,居然没有搜索到任何的相关信息,难道没有人遇到这个异常?还是我的写法有问题?Skip 是 Linq 分页的关键字,上面报错也是针对 Skip 的,如果我们把 Skip 去掉会怎样呢?

可以看到,我们不使用 Skip,只是使用 Take 进行 Top 查询,是没有任何问题的,还有个问题是,如果使用“计算”性质的 OrderBy,不管是 SQL Server Profiler,还是 EF7 Log 都捕获不到计算的表达式,比如上面的 Take 查询代码,使用 SQL Server Profiler,最后捕获到的 SQL 代码为:

你会看到,居然连 OrderBy 也没有了,不知道是什么原因?前几天也遇到这样类似一个问题:EntityFramework 7 smallint short 奇怪问题(已解决),主要是使用 short where 查询,没有捕获到,最后发现是 Linq 写法问题,应该使用 equals 进行判断,现在发现这两个问题比较相似,郁闷的是,不知道这个 Linq 该如何翻译。

上面这样方式行不通,自己也没有头绪,然后就在 Google 上搜各种关键词,比如:linq orderby math skip,linq calculate math skip 等等,但都尝试了下,还是不行,给出几个参考资料:

  • Custom order by, is it possible?
  • Linq OrderBy calculation of properties (with join)
  • LINQ: .NET Language-Integrated Query

网上关于 OrderBy 计算排序的资料,大部分是关于计算排序后获取 Count,然后再进行分组查询出来,比如这段 Linq 代码:

var query = from p in yourContext.Activation_Detailsgroup p by new{ProductVersion = p.ProductVersion,ProductID = p.ProductID,SubProductID = p.SubProductID}into pgrouplet count = pgroup.Count()orderby countselect new{Count = count,ProductVersion = pgroup.Key.ProductVersion,ProductID = pgroup.Key.ProductID,SubProductID = pgroup.Key.SubProductID};

但这不是我想要的,花了很多时间也没有找到正确的解决方式,最后换一种思路去思考这个问题,如果 OrderBy 在 Linq 中不能进行计算排序,那就针对这个排序计算进行“翻译”,什么意思呢?比如一开始的 ORDER BY ([b].[BlogId] * 2 + B.BlogCateId),其实就是对两个字段进行组合排序,一个是对 BlogId 进行翻倍,然后再加上 BlogCateId 的值,换一种方式其实也是可以的,比如下面这段代码:

var result = context.Blogs.OrderBy(b => b.BlogId * 2).ThenBy(b => b.BlogCateId).Skip(0).Take(100).ToList();

执行结果:

不知道这样的写法和一开始上面的 SQL 是不是一样的效果,如果你有更好的“翻译” Linq 代码,还请指教。

转载于:https://www.cnblogs.com/xishuai/p/ef7-orderby-thenby-skip-take-math.html

EntityFramework 7 OrderBy Skip Take-计算排序分页 SQL 翻译相关推荐

  1. 看看Entity Framework 4生成的复杂的分页SQL语句

    之前发现Entity Framework 4生成的COUNT查询语句问题,今天又发现它生成的分页SQL语句问题,而LINQ to SQL却不存在这个问题. >>> 来看一看,瞧一瞧! ...

  2. ORACLE分页SQL

    ORACLE分页SQL 1,使用rownum SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ...

  3. 优化的ms sql server分页sql语句

    优化的ms sql server分页sql语句 发布时间: 2009-8-15 00:00 |  发布作者: hjh |   |  查看: 3次 特点:一次查询,数据库Databnse只返回一页的数据 ...

  4. 盘点几种数据库的分页SQL的写法(转)

    Data序列--盘点几种数据库的分页SQL的写法 http://www.cnblogs.com/fireasy/archive/2013/04/10/3013088.html 转载于:https:// ...

  5. 微软企业库mysql分页存储_使用微软企业库,非分页sql语句得到分页数据方法

    最近使用微软企业库,在做分页绑定的时候发现好象还没有多少通用的方法.为了灵活和换数据库,我不能使用存储过程.为了开发速度最快.我就是用datagrid绑定了. 以前长用的 DataAdapter.Fi ...

  6. Oracle、DB2、SQLSERVER、Mysql、Access分页SQL语句梳理

    最近把平时在项目中常用到的数据库分页sql总结了下.大家可以贴出分页更高效的sql语句. sqlserver分页 第一种分页方法 需用到的参数: pageSize 每页显示多少条数据 pageNumb ...

  7. 报表性能优化方案之单数据集分页SQL实现层式报表

    1.概述 我们知道,行式引擎按页取数只适用于Oracle,mysql,hsql和sqlserver2008及以上数据库,其他数据库,如access,sqlserver2005,sqlite等必须编写分 ...

  8. oracle做分页式报表,报表性能优化方案之单数据集分页SQL实现层式报表

    1.概述 我们知道,行式引擎按页取数只适用于Oracle,mysql,hsql和sqlserver2008及以上数据库,其他数据库,如access,sqlserver2005,sqlite等必须编写分 ...

  9. java8 stream .skip() .limit() 实现分页功能

    java8 stream .skip() .limit() 实现分页功能 先分别介绍一下 skip() 和 limit(): 注意,注意,注意:数据量大或者数据复杂的情况下不要使用这种分页方式!! s ...

最新文章

  1. 在Dos下运行exe程序的时候出现找不到Cygwin1.dll文件的情况总结
  2. vue 02-上计算属性、样式的操作,指令(含自定义,全局和局部)
  3. nssl1192-加密【字符串hash】
  4. 阿里云oss上传图片
  5. wordpress ?php the_time() ?,WordPress时间函数the_time与get_the_time解析
  6. 9月26日发布?一加7T系列被“扒光”:硬核到没朋友
  7. Missing session attribute 'user' of type List 解决办法
  8. Go 爱好者福利,《Go 语言编程之旅》正式开源!
  9. 程序员必须掌握的十大经典算法
  10. ARM920T的MMU
  11. imdb数据集电影评论分类
  12. 比较好的运动耳机,好用的运动耳机推荐
  13. photoshop设计精讲精练 学习笔记(一)
  14. 红黑数和普通的二叉排序树有什么要求
  15. 该网页无法正常运作 目前无法处理此请求HTTP ERROR 500?
  16. 外企工作日常:全英文CrossTalk反串讲-讲前紧张,讲后淡定
  17. 小台灯内部电路原理图,仅供参考(实际测量自己的台灯的输入电压是直流135V。时间2021.3.9)
  18. 家用智能洗地机哪个牌子好、这几款旗舰机好用又实惠
  19. Qt播放视频报错 DirectShowPlayerService::doRender: Unresolved error code 0x80040266
  20. 欧姆龙OMRON Sysmac Studio工程怎么删除用户程序执行ID

热门文章

  1. 帝国cms用php输出点击数量,帝国CMS信息增加随机点击数的修改方法(最新教程)
  2. python中cgi到底是什么_十分钟搞懂什么是CGI(转)
  3. 精准容量、秒级弹性,压测工具 + SAE 方案如何成功突破传统大促难关?
  4. 开发函数计算的正确姿势——运行 Selenium Java
  5. 为你写诗:3 步搭建 Serverless AI 应用
  6. Kubernetes v1.16 发布 | 云原生生态周报 Vol. 20
  7. 为什么python这么火_Python为什么这么火?你了解多少呢?
  8. linux can 接收多帧_CAN编程介绍
  9. python只能对列表进行切片_Python3:类型错误:列表索引必须是整数或切片,而不是s...
  10. sql server表值函数与标量值函数实际应用