nhibernate的分页方法

在使用nhibernate的时候,想用来实现一个较简单的分页。

tMessage 表结构如下

 

image

在Default.cs中写了一个函数LoadMessages()

 

private void LoadMessages()
        {
            int page = 1;
            if (Request.Params["page"] != null)
            {
               
                page = Int32.Parse(Request.Params["page"]);
            }
            currentPage = page;
            if (page > 1)
            {
                lbtnPrevPage.Enabled = true;
                lbtnPrevPage.PostBackUrl = string.Format("default.aspx?page={0}", page - 1);
            }
            else
            {
                lbtnPrevPage.Enabled = false;
            }
            lbtnNextPage.PostBackUrl = string.Format("default.aspx?page={0}", page + 1);
            //根据当前页填写<前页><后页>
            helper = new NHibernateHelper();
            session = helper.GetSession();
            IList<Message> ml = session.CreateQuery("from Message order by CreateTime DESC").
                                    .SetFirstResult((page-1) * pageSize)
                                    .SetMaxResults(pageSize)
                                    .List<Message>();
            rptMessages.DataSource = ml;
            rptMessages.DataBind();
        }

lbtnPrevPage, lbtnNextPage为页面上的【前页】、【后页】的相关图标。

关键的是这一行

IList<Message> ml = session.CreateQuery("from Message order by CreateTime DESC").
                                    .SetFirstResult((page-1) * pageSize)
                                    .SetMaxResults(pageSize)
                                    .List<Message>();

IQuery接口的.SetFirstResult, .SetMaxResults为两个重要方法,SetFirstResult即指定结果集中开始行数,如为第1页,则开始行应该为0,如为第2页,则开始行应为 (2-1) * 每页记录数。SetMaxResults指定返回的结果的行数,即每页记录数。

执行效率

NHibernate执行为延迟执行,即在调用这两个方法后,会自动组合最优SQL,进行分页,因此执行起来的效率还不算太低,我的这个表中记录大概为15000行,第一次返回时的结果为1751ms,以后每次则只需要40-80ms之间。

posted @ 2011-11-16 11:02  萧风的风  阅读(351)  评论(2编辑  收藏  举报