昨天在用LINQ写分页的时候碰到一个很奇怪的问题:翻页的时候,有的数据会莫名其妙地消失,查了半个多小时才发现问题所在,其实是一个很细节的地方。

数据表如下:

LINQ分页的实现是:

var articles = context.Articles.Skip(startRecord).Take(pageSize);

当pageSize不为1时,得出的结果总是错的。用Profiler查看后,发现当pageSize为1时,LINQ生成的语句为:

SELECT TOP (10) [t0].[Id], [t0].[Content], [t0].[PublishTime] FROM [dbo].[Article] AS [t0]

当pageSize不为1是,LINQ生成的语句为:

SELECT [t1].[Id], [t1].[Content], [t1].[PublishTime]

FROM (

    SELECT ROW_NUMBER() OVER (ORDER BY [t0].[Id], [t0].[PublishTime]) AS [ROW_NUMBER], [t0].[Id], [t0].[Content], [t0].[PublishTime]

    FROM [dbo].[Article] AS [t0]

    ) AS [t1]

WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1

ORDER BY [t1].[ROW_NUMBER]

如果聚集索引刚好建立在Id字段上面,这样做是没有任何问题的。但我恰好把聚集索引建立到了PublishTime 上面。如此一来,当执行语句一的时候,分页是根据聚集索引进行排序的,但是执行语句二的时候,分页是根据Id排序的,所以就出现了数据“消失”的情况。弄清楚原因后,解决起来就简单啦,直接加一个排序字段就行啦。修改后的LINQ分页实现如下:

var articles = context.Articles.OrderBy(p=>p.PublishTime).Skip(startRecord).Take(pageSize);

生成的SQL语句也会变为

SELECT [t1].[Id], [t1].[Content], [t1].[PublishTime]

FROM (

    SELECT ROW_NUMBER() OVER (ORDER BY [t0].[PublishTime]) AS [ROW_NUMBER], [t0].[Id], [t0].[Content], [t0].[PublishTime]

    FROM [dbo].[Article] AS [t0]

    ) AS [t1]

WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1

ORDER BY [t1].[ROW_NUMBER]

这样的话结果就正确了。看样子以后这种细节问题还得多注意一下。

linq to sql 分页技术的更多相关文章

  1. LINQ to SQL使用教程

    前些时间用LINQ to SQL做了一些项目,现在打算总结一下,帮助新手快速入门,并写一些别的教程没提到的东西. 一.LINQ to SQL和别的LINQ to XXX有什么关系?二.延迟执行(Def ...

  2. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  3. 年终巨献 史上最全 ——LINQ to SQL语句

    LINQ to SQL语句(1)之Where 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句.Where操 ...

  4. LINQ TO SQL 大全

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 LINQ to SQL语句(1)之Where 适用场景: ...

  5. LINQ to SQL大全

    LINQ to SQL语句 (1)之Where Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的 ...

  6. [转]LINQ To SQL 语法及实例大全

    转载自:http://blog.csdn.net/pan_junbiao/article/details/7015633 LINQ to SQL语句(1)之Where Where操作 适用场景:实现过 ...

  7. LINQ to SQL语句非常详细(原文来自于网络)

    LINQ to SQL语句(1)之Where Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子 ...

  8. LINQ To SQL 语法及实例大全

    http://blog.csdn.net/pan_junbiao/article/details/7015633 http://blog.csdn.net/pan_junbiao/article/de ...

  9. 转载linq to sql 的详解

    [转]LINQ To SQL 语法及实例大全 2011-11-26阅读38651 评论9 LINQ to SQL语句(1)之Where Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL ...

随机推荐

  1. java IO与文件操作

    文件创建与删除 创建目录或文件 createNewFile() 需要文件目录已存在 public class IO { public static void main(String args[]) { ...

  2. graphviz 的节点形状

    graphviz 的节点可以定义不同的外形,比如下面的定义, digraph tt1{     a[shape=box];     c[shape=lpromoter];     d[shape=do ...

  3. 【1】Singleton模式(单例模式)

    一.单例模式的介绍 说到单例模式,大家第一反应应该就是--什么是单例模式?从“单例”字面意思上理解:一个类只有一个实例.所以单例模式也就是保证一个类只有一个实例的一种实现方法罢了(设计模式其实就是帮助 ...

  4. jquery之Ajax(一)

    1. load( url, [data], [callback] ) :载入远程 HTML 文件代码并插入至 DOM 中. url (String) : 请求的HTML页的URL地址. data (M ...

  5. scss-!optional

    optional翻译成汉语具有"可选的"的意思.顾名思义,!optional标记前面的扩展不必须生成一个新的选择器.看一段SCSS代码片段: p{ color:red; @exte ...

  6. Bootstrap学习笔记01

    1.Make Images Mobile Responsive 用处:   使图片适配你的页面宽度. 操作:   给图片添加 .img-responsive class属性. <img src= ...

  7. drupal7,注册成功之后想跳转到指定页面,该怎么破?

     1.hook sigup form alter,修改跳转地址 .还没试过 2.安装一下logintoboggan模块,里面有个注册后跳转到哪个页面的设置 这个对于不写代码的是比较方便的方法    3 ...

  8. 线上Bug修复流程

  9. Math.random理解练习

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  10. linux 源码包之脚本安装包的安装

    脚本安装包 脚本安装包并不是独立的软件包类型,常见的实际是源码包.是人为地把安装过程写成了自动安装脚本,只要执行脚本,定义简单的参数,就可以完成安装.非常类似于windows软件的安装方式.在linu ...