使用LINQ分页时需要注意的一个细节

 http://www.cnblogs.com/yzlhccdec/archive/2008/03/06/1093750.html

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

数据表如下:


LINQ分页的实现是:

 

 

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

 

 

pageSize不为1时,得出的结果总是错的。用Profiler查看后,发现当pageSize1时,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 ]

 

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值