使用linq时,怎样从一个主键有序不连续的表中查询指定位置范围的数据

好吧,刚刚受到xu castor的启发,我去查了查linq有没有类似于top或者limit的方法,结果就查出了Take()和Skip()......用linq查询出IQueryable对象之后,使用.Skip(n).Take(m)可以取出第n+1到第n+m个数据了……

■网友
linq走skip和take,sql走row_number

■网友
野生程序员一枚,对数据库刚入门,提供一个思路,见笑了,你试试看。
查询第m到第n个数据,可以先查询前n个数据,select top n * from table_name order by colum_name asc ,然后再构造一次子查询,倒序查询,select top (n-m+1) * from (select top n * from table_name order by colum_name asc) order by colum_name desc,相当于去头去尾,效率上应该还算过得去吧,而且这个功能上和键是不是有序的没关系,只要键能够比较就OK(当然我怀疑有序的效率会高一些)。
以大名鼎鼎的northwind下的Products表为例:
使用linq时,怎样从一个主键有序不连续的表中查询指定位置范围的数据

执行:
select top 5 * from (select top 10 * from Products order by ProductID asc) order by ProductID desc
结果如下:
使用linq时,怎样从一个主键有序不连续的表中查询指定位置范围的数据

结果是正确的,但是有个小问题是顺序是降序的,如果有升序要求,可以丧心病狂的再加一层:
【使用linq时,怎样从一个主键有序不连续的表中查询指定位置范围的数据】 select * from (select top 5 * from (select top 10 * from Products order by ProductID asc) order by ProductID desc) order by ProductID asc,这样结果就会按升序排列。


    推荐阅读