网站分页功能的实现(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>&nbsp;&nbsp;", 1);
        sb.AppendFormat("<a href='?page={0}' >上一页</a>&nbsp;&nbsp;", uppage);
        sb.AppendFormat("<a href='?page={0}' >下一页</a>&nbsp;&nbsp;", downpage);
        sb.AppendFormat("<a href='?page={0}' >尾页</a>&nbsp;&nbsp;", 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()方法就可以了。

文章刚开始的时候说过了,不再复述。


基本就这些了,看着有些乱,本人菜鸟一枚,上面的代码也是自己的练习,如果前面有不对或者不恰当的地方,还请大侠们指正,谢谢。


 


原创粉丝点击