网站分页功能的实现(Entity Framework和ADO.NET两种综述)
来源:互联网 发布:淘宝网上买彩票可靠吗 编辑:程序博客网 时间:2024/05/16 10:44
项目中用到了分页,上次是用的是Entity Framework,这次用ADO.NET,都是老师讲的,有必要总结一下,加深下记忆。
一、Entity Framework中完成分页
老师就讲了一种,在从数据库倒序查询到想要的list后,在对应的用户控件的.cs文件中用了两个方法。代码如下:
listnew= list.Skip( pagesize*(pagenow-1)).Take(pagesize).ToList();
其中pagesize代表一个页面要显示的个数,pagenow代表当前页面。
Skip()代表跳过序列中指定量的元素,返回剩余的元素。
Take()代表从序列的开头返回指定数量的连续元素。
假如一页显示3条内容,现在要显示第5页的内容,就先截取前四页的内容后,取下面紧接着的3条。
注意,要使用SKip()和Take()必须引用命名空间using system.Linq;而这个命名空间必须在.NET Framework3.5版本以上才具有。
二、ADO.NET实现分页
这个是今天我总结的重点。老师说实现它的SQL语句有三种,讲了两种,还有一种利用 ROW_NUMBER(),不过没讲,于是在网上搜了一下,三种方法如下:
数据库中表为Users,字段有id,name,pwd,和上面一样,每页显示3条数据,要求显示第5页的内容
1、
Sselect top 3 * from users
where id not in
(select top(3*4) id from users order by id desc )
order by id desc
这种方法跟上面Entity Framework中的方法一样,都是先跳过一些数据,然后取得所需数据。
不建议使用此方法,因为not in,如果数据多的话,效率会低很多,推荐下面两种方法。
2、
当要显示页为1时
select top 3 * from users order by id desc
当要显示的页大于1时(比方说还是上面的求第五页)
select top 3 * from users where id <
(select top 1 id from
(select top(3*4) * from users order by id desc) as tab
order by id) order by id desc
分析一下此SQL语句,先看select top(3*4) * from users order by id desc,是把前四页的内容按倒序找出来,
select top 1 id from (select top(3*4) * from users order by id desc) as tab order by id 是把刚才倒序找出来的内容当做表,然后把它按照id的升序进行排列,找到第一个也就是最小的那个id.
然后就是整句合起来看,取得倒序排列后前三个比刚才得到的那个id小的数据。
说的有点绕,其实也很简单,跟第一种方法比,都是把前四页的数据先找出来,而第一种方法是接着找前三个不属于前四页数据的内容(当然是倒序后),第二种方法是找出来后,再找那个最小的id,然后取前三个比这个id小的内容(当然也是倒序后)。
不懂的话,可以自己建张表,然后分我这三步看一下结果就知道了。
3、
select * from( select row_number() over(order by id desc)as rownum,* from users) as newtable where rownum between 13 and 15
此方法用到 row_number() over()函数,数据库在SQL2005版本以上才能使用
推荐使用此方法,因为简单嘛。
三、asp.net 实现分页的具体步骤
上面说的只是如何把想要的数据显示出来,如果是entity framework ,查出来全部用户list后,在.aspx.cs文件中直接用skip()和take()方法就可以了。如果是ado.net,必须把全部用户list1和当前页面要显示的list2都取出来,取全部用户list1的目的是为了得到它的count属性,因为在下面做分页的第一步中,需要用到总量count。当然,不必每次都去取,可以取出来以后放到缓存里,这个是题外话了。下面说一下就具体怎么实现:
1、先创建一个用户控件PageControl,在他的cs文件代码如下
public partial class Admin_PageControl : System.Web.UI.UserControl
{
protected string str;
private int pagesize;
public int Pagesize
{
get { return pagesize; }
set { pagesize = value; }
}
private int pagenow;
public int Pagenow
{
get { return pagenow; }
set { pagenow = value; }
}
private int count;//总共的数据条数
public int Count
{
get { return count; }
set { count = value; }
}
protected void Page_Load(object sender, EventArgs e)
{
NewPage();
}
private void NewPage()
{
StringBuilder sb = new StringBuilder();// 话说剑哥(我们老师)不让定义成sb来着。。
int pagecount = count % pagesize == 0 ? count / pagesize : count / pagesize + 1;
int uppage = pagenow == 1 ? 1 : pagenow - 1;//上一页
int downpage = pagenow == pagecount ? pagecount : pagenow + 1;//下一页
sb.AppendFormat("<a href='?page={0}' >首页</a> ", 1);
sb.AppendFormat("<a href='?page={0}' >上一页</a> ", uppage);
sb.AppendFormat("<a href='?page={0}' >下一页</a> ", downpage);
sb.AppendFormat("<a href='?page={0}' >尾页</a> ", pagecount);
str = sb.ToString();
}
}
至于它的ascx,直接输出<%=str%>就行了,样式表自己设置。
2、在DAL层中把数据查出来,看你用哪种了,如果entity framework,只查出来总共的list就行了,如果是dao.net,还得查当前要显示的list,而且SQL语句很长,三种SQL语句挑一种,最好用存储过程,这样性能会好些。关于存储过程,以后会再写篇文章专门总结一下,总觉得自己掌握的不太好。
3、在某个页面中使用上面做好的用户控件PageControl。举个例子,假设是MemberPage.aspx这个页面要用到吧,在页面中把控件加上后,接着在它的.cs页面中进行操作,
操作包括从数据库总取数据和对用户控件定义好的属性进行赋值。具体代码如下:
protected List<Member> Memberlist;
protected List<Member> AllMemberlist;
protected void Page_Load(object sender, EventArgs e)
{
NewPage();
}
private void NewPage()
{
int pagesize = 3;//假设每页显示三条数据
int pagenow = 1;//当前为第一页
if (Request.QueryString["page"] != null)
{
pagenow =int.Parse( Request.QueryString["page"]);
}
AdminManager.BLL.UserRolesManageBLL urmb = new AdminManager.BLL.UserRolesManageBLL(); //底层是抽象工厂做的,没引用命名空间,这样路径清晰点。。
AllMemberlist = urmb.GetAllMember(); //所有用户数据,在DAL层把它查出来后顺便加到缓存中,或者从缓存中去取出来
Memberlist = urmb.GetMemberList(pagesize,pagenow); //这个是当前页面要显示的数据
int count = AllMemberlist.Count;
PageControl1.Pagenow = pagenow; //一下这三个都是对用户控件PageControl的属性进行赋值
PageControl1.Pagesize = pagesize;
PageControl1.Count = count;
}
注意了,上面的代码是针对ado.net的,如果用的是entity framework,那太简单了,直接把AllMemberlist 取出来后,用Skip()和Take()方法就可以了。
文章刚开始的时候说过了,不再复述。
基本就这些了,看着有些乱,本人菜鸟一枚,上面的代码也是自己的练习,如果前面有不对或者不恰当的地方,还请大侠们指正,谢谢。
- 网站分页功能的实现(Entity Framework和ADO.NET两种综述)
- 用代码说废话之--实现ADO.NET Entity Framework 的数据分页
- ADO.NET Entity Framework 4.0 的新增功能
- ADO.NET Entity Framework
- ADO.NET Entity Framework
- ADO.NET Entity Framework
- ADO.NET Entity FrameWork
- (转)ADO.NET Entity Framework
- ADO.NET Entity Framework 学习(1)
- ADO.NET Entity Framework 学习(2)
- ADO.NET Entity Framework与ADO.NET的区别
- ADO.NET Entity Framework与ADO.NET的区别
- Entity Framework介绍更多»Entity Framework的全称是ADO.NET Entity Framework,
- Asp.Net Ajax+WCF Service+ADO.NET Entity Framework实现数据列表,数据筛选,分页,排序,删除
- 关注ADO.NET Entity Framework
- Mysql ADO.NET Entity Framework
- (转)ADO.NET entity framework
- (转)ADO.NET entity framework
- Android拍照、录像、录音代码范例
- w3cshool之JavaScript对象_RegExp
- 程序之外的一点点理财知识
- UpdatePanel和jQuery不兼容问题
- iOS: autosizing
- 网站分页功能的实现(Entity Framework和ADO.NET两种综述)
- 如何解决websql中的异步问题
- To my teacher...
- Js获取当前日期时间及其它操作
- 浙大acm1755经验总结
- debug版函数初始化入口 0xcc
- APNS推送通知的流程
- ASIHTTPRequest 详解, http 请求终结者
- 正则连载,有去字符串的