先解释一下这个标题的意思,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. LeetCode简单题之卡牌分组
  2. C++中fstream的使用
  3. macos windowserver占用内存_【v007】如何安装MAC OS的虚拟机系统(上)
  4. Python----Day1
  5. LoadRunner 测试Oracle数据库及Siebel性能
  6. html设置团偏跟着移动,雷阵雨云团向东偏南移动,北京两地将有强降雨+7级大风+冰雹!...
  7. P2824-[HEOI2016/TJOI2016]排序【线段树,二分】
  8. ft服务器设置传输协议,ft服务器设置成主动模式
  9. 第一周周报(3月15-3月21)
  10. linux一切皆是文件_LINUX一切皆文件
  11. 分享:MySQL 学习笔记(二)
  12. Python天天美味(35) - 细品lambda(转)
  13. C#-求int数组中连续偶数列的个数
  14. [转]Git 撤销操作
  15. 如何调整mysql严谨度_如何管理 MySQL 的 binlog 收藏
  16. Python 格式化输出 —— %r 与 %s 的区别(__repr__ 与 __str__)
  17. Directx11学习笔记【七】 游戏定时器的实现
  18. python.day.04——常用数据类型(一):strList
  19. mariadb数据库基本使用
  20. android 符号表情显示乱码,微信昵称含中文、特殊字符、emoji表情乱码的后台解决方案...

热门文章

  1. 考研专业课计算机网络调剂,计算机网络信息中心2019年硕士研究生接收调剂信息公告...
  2. centos7 ldap php,php7安装ldap扩展
  3. mysql需要下载调试_Mysql安装和调试
  4. c语言获取时间并存储,如何在C程序中获取日期和时间值?
  5. python语言及其应用电子版翁正秋_Python语言及其应用
  6. 【必看】新手妹子一键删库,老司机机智救场
  7. Fluid 架构创新论文被国际数据库顶会 ICDE 录用
  8. 【无标题】12.04 Serverless Meetup 深圳站 | Call 你来参加
  9. 阿里研究员谷朴:警惕软件复杂度困局
  10. Go 语言 2019 调查报告发布(内含 Go 语言图谱下载)