Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can you do paging with NHibernate?

For example, I want to populate a gridview control in an ASP.NET web page with only the data necessary for the # of rows displayed. How can NHibernate support this?

like image 418
Ray Avatar asked Sep 10 '08 17:09

Ray


2 Answers

ICriteria has a SetFirstResult(int i) method, which indicates the index of the first item that you wish to get (basically the first data row in your page).

It also has a SetMaxResults(int i) method, which indicates the number of rows you wish to get (i.e., your page size).

For example, this criteria object gets the first 10 results of your data grid:

criteria.SetFirstResult(0).SetMaxResults(10); 
like image 138
Jon Limjap Avatar answered Oct 17 '22 07:10

Jon Limjap


You can also take advantage of the Futures feature in NHibernate to execute the query to get the total record count as well as the actual results in a single query.

Example

 // 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>(); 

To get the total record count, you do the following:

int iRowCount = rowCount.Value; 

A good discussion of what Futures give you is here.

like image 38
Jeremy D Avatar answered Oct 17 '22 09:10

Jeremy D