AutumnalRiver

我喜欢秋天,因为那是丰收的时节。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

LINQ to SQL 分页问题

Posted on 2010-06-13 16:43  秋江  阅读(6099)  评论(3编辑  收藏  举报
Technorati 标签: LINQ to SQL

自从 .NET Framework 有了 LINQ,SQL 分页有了新的选择,那就是简单使用 Skip 及 Take 方法。当然,别忘了加上排序。本以为对此没有什么可怀疑的,殊不知在我们的产品 SE 中却碰到了很奇怪的一个问题:对某张表执行的分页查询,有一条数据在所有分页中均没有出现。通过查看真正执行的 SQL 发现,SqlProvider 翻译的第一页的 SQL 用的是 TOP N,而其他分页用的是 ROW_NUMBER 函数 + 范围限定。多的不说,仅从二者的不同,我就觉得其结果不能划等号。但是,在另建的测试中,我发现二者结果没有什么问题。百思不得其解之余,也只能自我安慰说 MS 会保证二者逻辑一致,至于为何用不同的方法,那是出自性能的考虑。

直至今日,突然想起这个问题,就 GOOGLE 了一把,看看是否有同学碰到这样的问题。结果就找到了: 利用 LINQ to SQL 對資料做分頁時應注意的事 ( 重要 ),其结论就是要注意使用 OrderBy 方法,否则数据逻辑不对。然后按其说的进行了测试,实际情况确实如此,但是我也加了排序,为何还有问题呢?我暂时没办法重现这个问题,因为业务数据在变化,现在看来又正常了。

解铃还需系铃人,只能期望 MS 在新的版本中解决这个问题了。办法很简单:首页不用 TOP N,而是统一使用 ROW_NUMBER 函数。由于 SE 服务器端的代码还没有使用 .NET Framework 4 编译,所以也就一直没有尝试。今天测试了一下,发现在 NF 4.0 中,已经修正了这个问题,结果如下:

4.0 的 SQL

比对一下:

3.5 的 SQL

NF 4.0 出来有一段时间了,只是我比较懒,一直没有测试过这个问题。直到在看到 LINQ to SQL changes in .NET 4.0 其中提及的 Skip(0) 才有此次测试。所以,还在用 3.5 的兄弟们,赶紧升级到 4.0 吧。