EntityFramework 7 OrderBy Skip Take-计算排序分页 SQL 翻译
先解释一下这个标题的意思,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 翻译相关推荐
- 看看Entity Framework 4生成的复杂的分页SQL语句
之前发现Entity Framework 4生成的COUNT查询语句问题,今天又发现它生成的分页SQL语句问题,而LINQ to SQL却不存在这个问题. >>> 来看一看,瞧一瞧! ...
- ORACLE分页SQL
ORACLE分页SQL 1,使用rownum SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ...
- 优化的ms sql server分页sql语句
优化的ms sql server分页sql语句 发布时间: 2009-8-15 00:00 | 发布作者: hjh | | 查看: 3次 特点:一次查询,数据库Databnse只返回一页的数据 ...
- 盘点几种数据库的分页SQL的写法(转)
Data序列--盘点几种数据库的分页SQL的写法 http://www.cnblogs.com/fireasy/archive/2013/04/10/3013088.html 转载于:https:// ...
- 微软企业库mysql分页存储_使用微软企业库,非分页sql语句得到分页数据方法
最近使用微软企业库,在做分页绑定的时候发现好象还没有多少通用的方法.为了灵活和换数据库,我不能使用存储过程.为了开发速度最快.我就是用datagrid绑定了. 以前长用的 DataAdapter.Fi ...
- Oracle、DB2、SQLSERVER、Mysql、Access分页SQL语句梳理
最近把平时在项目中常用到的数据库分页sql总结了下.大家可以贴出分页更高效的sql语句. sqlserver分页 第一种分页方法 需用到的参数: pageSize 每页显示多少条数据 pageNumb ...
- 报表性能优化方案之单数据集分页SQL实现层式报表
1.概述 我们知道,行式引擎按页取数只适用于Oracle,mysql,hsql和sqlserver2008及以上数据库,其他数据库,如access,sqlserver2005,sqlite等必须编写分 ...
- oracle做分页式报表,报表性能优化方案之单数据集分页SQL实现层式报表
1.概述 我们知道,行式引擎按页取数只适用于Oracle,mysql,hsql和sqlserver2008及以上数据库,其他数据库,如access,sqlserver2005,sqlite等必须编写分 ...
- java8 stream .skip() .limit() 实现分页功能
java8 stream .skip() .limit() 实现分页功能 先分别介绍一下 skip() 和 limit(): 注意,注意,注意:数据量大或者数据复杂的情况下不要使用这种分页方式!! s ...
最新文章
- 在Dos下运行exe程序的时候出现找不到Cygwin1.dll文件的情况总结
- vue 02-上计算属性、样式的操作,指令(含自定义,全局和局部)
- nssl1192-加密【字符串hash】
- 阿里云oss上传图片
- wordpress ?php the_time() ?,WordPress时间函数the_time与get_the_time解析
- 9月26日发布?一加7T系列被“扒光”:硬核到没朋友
- Missing session attribute 'user' of type List 解决办法
- Go 爱好者福利,《Go 语言编程之旅》正式开源!
- 程序员必须掌握的十大经典算法
- ARM920T的MMU
- imdb数据集电影评论分类
- 比较好的运动耳机,好用的运动耳机推荐
- photoshop设计精讲精练 学习笔记(一)
- 红黑数和普通的二叉排序树有什么要求
- 该网页无法正常运作 目前无法处理此请求HTTP ERROR 500?
- 外企工作日常:全英文CrossTalk反串讲-讲前紧张,讲后淡定
- 小台灯内部电路原理图,仅供参考(实际测量自己的台灯的输入电压是直流135V。时间2021.3.9)
- 家用智能洗地机哪个牌子好、这几款旗舰机好用又实惠
- Qt播放视频报错 DirectShowPlayerService::doRender: Unresolved error code 0x80040266
- 欧姆龙OMRON Sysmac Studio工程怎么删除用户程序执行ID
热门文章
- 帝国cms用php输出点击数量,帝国CMS信息增加随机点击数的修改方法(最新教程)
- python中cgi到底是什么_十分钟搞懂什么是CGI(转)
- 精准容量、秒级弹性,压测工具 + SAE 方案如何成功突破传统大促难关?
- 开发函数计算的正确姿势——运行 Selenium Java
- 为你写诗:3 步搭建 Serverless AI 应用
- Kubernetes v1.16 发布 | 云原生生态周报 Vol. 20
- 为什么python这么火_Python为什么这么火?你了解多少呢?
- linux can 接收多帧_CAN编程介绍
- python只能对列表进行切片_Python3:类型错误:列表索引必须是整数或切片,而不是s...
- sql server表值函数与标量值函数实际应用