在使用nhibernate的时候,想用来实现一个较简单的分页。
tMessage 表结构如下
在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之间。