【LINQ】分享:举例证明Linq to Sql的数据库端分页货真价实
2009-11-24 17:18
344 查看
我们以前写程序,提到数据库端分页,一般会感觉实现起来蛮麻烦的,尤其是对SQL 2000的DB,要自己写一堆SQL或写个存储过程什么的。而现在如果用VS2008里的Linq查询语法的话,对开发人员来说就变的超级简单了。
在上周五(11月20日) Linq介绍的课程上,大家有讨论到Linq to Sql的延迟执行和数据库端分页具体是怎么做到的?我今天用一个小例子测试了一下,分享给大家。
Linq的分页语法如下:
[数据源对象集合].Skip((index-1) * pageSize).Take(pageSize)
比如一个显示sys_users表所有记录的Grid,每页显示20条记录,现在要显示第5页数据的话, Linq的写法如下:
var userList = ctx.sys_users.Skip((5-1)*20).Take(20);
//上面这句的意思也就是查sys_users表,跳过前80条记录,取后面的20条记录
现在我们结合下面的几张图片一边Debug,一边从SQL Server Profiler来看看具体的执行过程:
我们想要的结果是:查sys_users表中的第3、4条记录。
1、当运行到var userList14 = ctx.sys_users.Skip(2).Take(2); 这句时,可以从Profiler看到还没有做任何查询相关的动作。
exec sp_executesql N'SELECT [t1].[user_id], [t1].[first_name], [t1].[last_name], [t1].[age], [t1].[birth_date], [t1].[email], [t1].[sex]
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY [t0].[user_id], [t0].[first_name], [t0].[last_name], [t0].[age], [t0].[birth_date], [t0].[email], [t0].[sex]) AS [ROW_NUMBER], [t0].[user_id], [t0].[first_name], [t0].[last_name], [t0].[age], [t0].[birth_date], [t0].[email], [t0].[sex]
FROM [dbo].[sys_users] AS [t0]
) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]',N'@p0 int,@p1 int',@p0=2,@p1=2
查询结果为:
SELECT TOP 2 [t1].[user_id], [t1].[first_name], [t1].[last_name], [t1].[age], [t1].[birth_date], [t1].[email], [t1].[sex]
FROM [dbo].[sys_users] AS [t1]
WHERE NOT (EXISTS(
SELECT NULL AS [EMPTY]
FROM (
SELECT TOP 2 [t2].[user_id]
FROM [dbo].[sys_users] AS [t2]
) AS [t3]
WHERE [t1].[user_id] = [t3].[user_id]
))
可以参考:/article/5295363.html
2、另外要说明一点,在Debug过程中,如果即时查看Linq查询语句的结果视图,会使得Linq查询立即执行。还用上面的例子来看,我在执行到第二步时,去看了一下userList14这个变量的值,就导致了执行查询,如下图所示:
如果大家有其它什么问题,欢迎提出,大家一起探讨。
在上周五(11月20日) Linq介绍的课程上,大家有讨论到Linq to Sql的延迟执行和数据库端分页具体是怎么做到的?我今天用一个小例子测试了一下,分享给大家。
Linq的分页语法如下:
[数据源对象集合].Skip((index-1) * pageSize).Take(pageSize)
比如一个显示sys_users表所有记录的Grid,每页显示20条记录,现在要显示第5页数据的话, Linq的写法如下:
var userList = ctx.sys_users.Skip((5-1)*20).Take(20);
//上面这句的意思也就是查sys_users表,跳过前80条记录,取后面的20条记录
现在我们结合下面的几张图片一边Debug,一边从SQL Server Profiler来看看具体的执行过程:
我们想要的结果是:查sys_users表中的第3、4条记录。
1、当运行到var userList14 = ctx.sys_users.Skip(2).Take(2); 这句时,可以从Profiler看到还没有做任何查询相关的动作。
exec sp_executesql N'SELECT [t1].[user_id], [t1].[first_name], [t1].[last_name], [t1].[age], [t1].[birth_date], [t1].[email], [t1].[sex]
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY [t0].[user_id], [t0].[first_name], [t0].[last_name], [t0].[age], [t0].[birth_date], [t0].[email], [t0].[sex]) AS [ROW_NUMBER], [t0].[user_id], [t0].[first_name], [t0].[last_name], [t0].[age], [t0].[birth_date], [t0].[email], [t0].[sex]
FROM [dbo].[sys_users] AS [t0]
) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]',N'@p0 int,@p1 int',@p0=2,@p1=2
查询结果为:
SELECT TOP 2 [t1].[user_id], [t1].[first_name], [t1].[last_name], [t1].[age], [t1].[birth_date], [t1].[email], [t1].[sex]
FROM [dbo].[sys_users] AS [t1]
WHERE NOT (EXISTS(
SELECT NULL AS [EMPTY]
FROM (
SELECT TOP 2 [t2].[user_id]
FROM [dbo].[sys_users] AS [t2]
) AS [t3]
WHERE [t1].[user_id] = [t3].[user_id]
))
可以参考:/article/5295363.html
2、另外要说明一点,在Debug过程中,如果即时查看Linq查询语句的结果视图,会使得Linq查询立即执行。还用上面的例子来看,我在执行到第二步时,去看了一下userList14这个变量的值,就导致了执行查询,如下图所示:
如果大家有其它什么问题,欢迎提出,大家一起探讨。
相关文章推荐
- MVC中使用Linq To Sql进行数据查询及分页
- linqtosql 实现数据分页
- Linq to sql之简单的分页
- 在winforms中使用LINQ to SQL实现高效分页
- linq to sql 学习(6)linq的分页实例
- linq to sql 怎么查询前 11 条数据
- Linq to SQL 通过主键删除数据
- Linq to SQL 插入数据时的一个问题
- MVC+LINQToSQL的Repository模式之(一)数据工厂
- LINQ to SQL——动态数据支持
- ASP.NET网站开发——LINQ TO SQL 动态数据支持
- 在使用Linq to SQL并序列化一个数据对象的时候报System.InvalidOperationException异常,序列化类型XXX的对象时检测到循环引用。
- 关于使用Linq to sql作为数据交互时的架构问题
- LinqToSql中更新或删除数据时"找不到行或者行已更改"的解决办法
- asp.net Linq TO Sql 分页方法
- Linq to sql :查询句法---分页分组查询
- Linq to SQL数据乱码问题
- 【LINQ专题】使用LINQ to SQL插入、修改、删除数据
- LINQTOSQL作为底层ORM框架后,我们的数据基类就变成了这个样子
- LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据