你如何使用NHibernate进行分页?

例如,我想在ASP.NET网页中填充一个gridview控件,只显示显示的行数所需的数据。 NHibernate如何支持这个?


ICriteria有一个SetFirstResult(int i)方法,它表示您希望获得的第一个项目的索引(基本上是页面中的第一个数据行)。

它还有一个SetMaxResults(int i)方法,它表示你希望得到的行数(即你的页面大小)。

例如,这个标准对象获取数据网格的前10个结果:

criteria.SetFirstResult(0).SetMaxResults(10);

您还可以利用NHibernate中的Futures特性来执行查询,以获得单个查询中的总记录数以及实际结果。

 // Get the total row count in the database.
var rowCount = this.Session.CreateCriteria(typeof(EventLogEntry))
    .Add(Expression.Between("Timestamp", startDate, endDate))
    .SetProjection(Projections.RowCount()).FutureValue<Int32>();

// Get the actual log entries, respecting the paging.
var results = this.Session.CreateCriteria(typeof(EventLogEntry))
    .Add(Expression.Between("Timestamp", startDate, endDate))
    .SetFirstResult(pageIndex * pageSize)
    .SetMaxResults(pageSize)
    .Future<EventLogEntry>();

要获得总记录数,请执行以下操作:

int iRowCount = rowCount.Value;

关于期货给你的一个很好的讨论就在这里。


在NHibernate 3中,你可以使用QueryOver

var pageRecords = nhSession.QueryOver<TEntity>()
            .Skip(PageNumber * PageSize)
            .Take(PageSize)
            .List();

你也可能想明确地命令你的结果是这样的:

var pageRecords = nhSession.QueryOver<TEntity>()
            .OrderBy(t => t.AnOrderFieldLikeDate).Desc
            .Skip(PageNumber * PageSize)
            .Take(PageSize)
            .List();
链接地址: http://www.djcxy.com/p/20315.html

上一篇: How can you do paging with NHibernate?

下一篇: Python word counter