AspNetPager是一个第三方分页第三方控件,可以和数据绑定控件(GridView等)方便的结合,实现真分页。

真分页:从数据库中获取符合要求的部分数目的记录。性能较高,数据量小,网络负载小,对数据库需求小。但需要数据库端进行少量的数目筛选操作,稍占CPU。

伪分页:GridView结合SqlDataSource自带的分页,从数据库中获取要求的全部数据,到程序中再分页。性能较低,数据量大,网络负载大,对数据库需求大。在获取大量数据时很慢。

有关AspNetPager控件的信息,可查阅官方网站:http://www.webdiyer.com/

下面写个简单的例子:

1.新建数据库ILTSDB,建立一张words表,表结构如下:

2.VS2010新建WEB窗体,并通过Entity FrameWork或linq来生成实体模型。

3.放置GridView和AspNetPager控件.给AspNetPager控件添加个换页事件方法AspNetPager1_PageChanged,限制每页显示14条PageSize="14",其他默认。

GridView支持自动生成列等功能,不用人工像Repeater写Eval()绑定字段代码。比较简单。所以本例使用它。

4.编写从数据库获取所需分页数据的代码,并绑定给GridView。

前台ASPX代码:

 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="AspNetPager.aspx.cs" Inherits="Test_AspNetPager" %>
<%@ Register Assembly="AspNetPager" Namespace="Wuqi.Webdiyer" TagPrefix="webdiyer" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server">
</asp:GridView> <webdiyer:AspNetPager ID="AspNetPager1" runat="server" PagingButtonSpacing="10px"
ShowCustomInfoSection="Right" CustomInfoHTML="总记录数:%RecordCount%,总页数:%PageCount%,当前为第%CurrentPageIndex%页"
Width="100%" LayoutType="Table" ShowNavigationToolTip="true" SubmitButtonText="Go"
ShowPageIndexBox="Always" UrlPageIndexName="pageindex" PageSize="" OnPageChanged="AspNetPager1_PageChanged"
CssClass="paginator">
</webdiyer:AspNetPager>
</div>
</form>
</body>
</html>

后台CS代码:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Intelligent.Data.Models; public partial class Test_AspNetPager : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
ShowInfo();
} protected void AspNetPager1_PageChanged(object sender, EventArgs e)
{
ShowInfo();
} private void ShowInfo()
{
int recordCount = ;
int pageIndex = AspNetPager1.CurrentPageIndex;
int pageSize = AspNetPager1.PageSize; ILTSDBContext dc = new ILTSDBContext();
var query=dc.words.Where(w => w.wordsID < );
AspNetPager1.RecordCount=query.Count();
GridView1.DataSource = query
.OrderBy(v => v.wordsID).Skip((pageIndex - ) * pageSize).Take(pageSize)
.ToList();
GridView1.DataBind();
//AspNetPager1.RecordCount = recordCount;
}
}

OK了,运行一把。
效果见图:

好,接下来我们来看下EF对数据库进行操作时,底层到底生成了什么SQL语句。

第一反应,应该有top(),count()等函数,pageSize,beginNum(可以计算得出)等参数,最后Select出来。的确,那到底如何SQL是什么呢?!我真不确定,至少很难写,不过没事,这事EF会帮我们自动生成语句。

打开SQL Server Management Studio,建立新SQL SERVER PROFILER,监视连接SQL SERVER的用户、操作命令、时间等等。

我们可以根据时间、连接用户名等信息确定哪些命令是我们操作的。下面把这些命令取出,我们分析下:

 --repeater选取第二页数据(每页14个数据)的c#LINQ代码~实际SQL代码比较

 --var query = dc.words.Where(w => w.wordsID < 1000);--LINQ延迟查询,未真正查询数据库
--AspNetPager1.RecordCount=query.Count();--真正查询数据库获取符合要求的总记录数,SQL语句如下
SELECT [GroupBy1].[A1] AS [C1]
FROM ( SELECT
COUNT(1) AS [A1]
FROM [dbo].[words] AS [Extent1]
WHERE [Extent1].[wordsID] < 1000
) AS [GroupBy1]
--在本例中效果类似于
SELECT
COUNT(1) AS [A1]
FROM [dbo].[words] AS [Extent1]
WHERE [Extent1].[wordsID] < 1000 --获取分页数据,ToList()立即查询数据库
--GridView1.DataSource = query
-- .OrderBy(v => v.wordsID).Skip((pageIndex - 1) * pageSize).Take(pageSize)
-- .ToList(); SELECT TOP (14)
[Filter1].[wordsID] AS [wordsID],
[Filter1].[parentID] AS [parentID],
[Filter1].[wordInfo] AS [wordInfo],
[Filter1].[phonogram] AS [phonogram],
[Filter1].[sound] AS [sound],
[Filter1].[picture] AS [picture],
[Filter1].[origin] AS [origin],
[Filter1].[createUser] AS [createUser],
[Filter1].[createDate] AS [createDate],
[Filter1].[editUser] AS [editUser],
[Filter1].[editDate] AS [editDate],
[Filter1].[remark] AS [remark]
FROM
(--可以单独运行下试试
SELECT [Extent1].[wordsID] AS [wordsID], [Extent1].[parentID] AS [parentID], [Extent1].[wordInfo] AS [wordInfo], [Extent1].[phonogram] AS [phonogram], [Extent1].[sound] AS [sound], [Extent1].[picture] AS
[picture], [Extent1].[origin] AS [origin], [Extent1].[createUser] AS [createUser], [Extent1].[createDate] AS [createDate], [Extent1].[editUser] AS [editUser], [Extent1].[editDate] AS [editDate],
[Extent1].[remark] AS [remark],
--函数值作为列名row_number的值
row_number() OVER (ORDER BY [Extent1].[wordsID] ASC) AS [row_number]
FROM [dbo].[words] AS [Extent1]
WHERE [Extent1].[wordsID] < 1000
) AS [Filter1]
--筛选条件就是row_number列的值,
--14是一页的记录数目,>14结合之前的TOP (14)就是查询第二页信息
WHERE [Filter1].[row_number] > 14
ORDER BY [Filter1].[wordsID] ASC

已经添加注释,各位理解下吧。

这段SQL代码中,我没想到的是row_number()和新列row_number。参见http://www.cnblogs.com/icebutterfly/archive/2009/08/05/1539657.html或其他。

好了,就写到这了。

后记:如果不用linq或EF的话,单用ADO.NET写分页其实还真蛮复杂的,尤其是分页的SQL语句,像我这种功底不深的人是写不出来的。。。。哎。当然,写可以大牛的DBA写个存储过程在数据库里,程序员传参直接调用就好。这个方法,可以参见http://www.webdiyer.com/或者直接看实例:http://www.webdiyer.com/aspnetpagerdemo/pagedrepeater/default.aspx

使用第三方分页AspNetPager实现真正分页的SQL原理的更多相关文章

  1. AspNetPager实现真分页+多种样式

    真假分页 分页是Web应用程序中最常用到的功能之一.当从数据库中获取的记录远远超过界面承载能力的时候,使用分页可以使我们的界面更加美观,更加的用户友好.分页包括两种类型:真分页和假分页. 其中假分页就 ...

  2. 稳定易用的 Django 分页库,完善分页功能

    作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 在 通过 Django Pagination 实现简单分页 中,我们实现了一个简单的 ...

  3. pagebean pagetag java 后台代码实现分页 demo 前台标签分页 后台java分页

    java 后台代码实现分页 demo 实力 自己写的 标签分页 package com.cszoc.sockstore.util; import java.util.HashMap;import ja ...

  4. MvcPager 概述 MvcPager 分页示例 — 标准Ajax分页 对SEO进行优化的ajax分页 (支持asp.net mvc)

    该示例演示如何使用MvcPager最基本的Ajax分页模式. 使用AjaxHelper的Pager扩展方法来实现Ajax分页,使用Ajax分页模式时,必须至少指定MvcAjaxOptions的Upda ...

  5. php分页类代码带分页样式效果(转)

    php分页类代码,有漂亮的分页样式风格 时间:2016-03-16 09:16:03来源:网络 导读:不错的php分页类代码,将类文件与分页样式嵌入,实现php查询结果的精美分页,对研究php分页原理 ...

  6. PHP+jQuery 列表分页类 ( 支持 url 分页 / ajax 分页 )

    /* ******* 环境:Apache2.2.8 ( 2.2.17 ) + PHP5.2.6 ( 5.3.3 ) + MySQL5.0.51b ( 5.5.8 ) + jQuery-1.8.3.mi ...

  7. LayUI分页,LayUI动态分页,LayUI laypage分页,LayUI laypage刷新当前页

    LayUI分页,LayUI动态分页,LayUI laypage分页,LayUI laypage刷新当前页 >>>>>>>>>>>> ...

  8. Angularjs的真分页,服务端分页,后台分页的解决方案

    背景:项目的框架使用的是Angularjs,在做数据展示的时候,使用的是ng-table.用过ng-table的人都知道,他是自带分页的,默认分页方式是假分页.也就是一口气把所有的数据从数据库里取出来 ...

  9. SSM 使用 mybatis 分页插件 pagehepler 实现分页

    使用分页插件的原因,简化了sql代码的写法,实现较好的物理分页,比写一段完整的分页sql代码,也能减少了误差性. Mybatis分页插件 demo 项目地址:https://gitee.com/fre ...

随机推荐

  1. JavaScript案例七:简单生成表格

    JavaScript简单生成表格,巩固基础知识点... <!DOCTYPE html> <html> <head> <title>JavaScript简 ...

  2. GC日志介绍

    每一种收集器的日志形式都是由它们自身的实现所决定的,换而言之,每个收集器的日志格式都可以不一样.但虚拟机设计者为了方便用户阅读,将各个收集器的日志都维持一定的共性,例如以下两段典型的GC日志: 33. ...

  3. 2016.7.8 计算机网络复习要点第四章之地址解析协议ARP

    1.地址解析协议ARP:知道一个机器的IP地址,需要找到其相应的硬件地址:ARP协议的用途是为了从网络层使用的IP地址解析出在链路层使用的硬件地址: 2.由于是IP协议使用了ARP协议,因此通常就把A ...

  4. mysql的常用函数

    原文地址参考:http://www.cnblogs.com/ringwang/archive/2008/07/05/1236292.html 1. 控制流函数 1.1  IFNULL(expr1,ex ...

  5. 简单几何(线段相交)+模拟 POJ 3449 Geometric Shapes

    题目传送门 题意:给了若干个图形,问每个图形与哪些图形相交 分析:题目说白了就是处理出每个图形的线段,然后判断是否相交.但是读入输出巨恶心,就是个模拟题加上线段相交的判断,我第一次WA不知道输出要按字 ...

  6. HDU1247 Hat’s Words(Trie树)

    常规做法是枚举每个字符串每个位置,时间复杂度O(n*len*len),(建字典树O(n*len)). 然而我看这题第一眼想的是时间复杂度O(n*len)的算法..就是建正反两棵字典树,每个字符串跑分别 ...

  7. POJ2570 Fiber Network(Floyd)

    d[i][j]表示从i点到j点可以全程提供光纤的公司的集合,集合用26位的二进制压缩. 那么状态转移方程就是dk[i][j]|=dk-1[i][k]&dk-1[k][j]. #include& ...

  8. TYVJ P1038/P1039 忠诚 标签:线段树

    做题记录:2016-08-12 16:30:14 //P1038 描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家 ...

  9. Get the log from android device

    Theme: How to get the log from device ?  Detail:  Get the log from device, and write to the local fi ...

  10. 什么是SQL注入式攻击

    什么是SQL注入式攻击? 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影响 ...