2008-09-10 8 views
101

Например, я хочу заполнить элемент управления gridview на веб-странице ASP.NET только с данными, необходимыми для отображения количества строк. Как NHibernate может это поддержать?Как сделать пейджинг с NHibernate?

ответ

107

ICriteria имеет метод SetFirstResult(int i), который указывает индекс первого элемента, который вы хотите получить (в основном первая строка данных на вашей странице).

Он также имеет метод SetMaxResults(int i), который указывает количество строк, которое вы хотите получить (например, размер вашей страницы).

Например, этот критерий объект получает первые 10 результатов вашей сетки данных:

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

Это в значительной степени синтаксис Linq (to NH) будет выглядеть так или иначе - Nice. – MotoWilliams 2008-09-17 05:04:15

+13

Важно отметить, что вам нужно будет выполнить отдельную транзакцию для извлечения общего количества строк, чтобы отобразить ваш пейджер. – 2009-01-07 00:44:45

23

Как насчет использования Linq для NHibernate, как обсуждалось в this blog post от Ayende?

Пример кода:

(from c in nwnd.Customers select c.CustomerID) 
     .Skip(10).Take(10).ToList(); 

А вот подробный пост в блоге команды NHibernate на Data Access With NHibernate включая осуществление пейджинга.

+0

Примечание LINQ к NHibernate в пакете вно и не включены в NHibernate 2.0 release – Richard 2008-09-23 08:54:36

6

я предлагаю вам создать специальную структуру для борьбы с пагинацией. Нечто подобное (я программист Java, но это должно быть легко карту):

public class Page { 

    private List results; 
    private int pageSize; 
    private int page; 

    public Page(Query query, int page, int pageSize) { 

     this.page = page; 
     this.pageSize = pageSize; 
     results = query.setFirstResult(page * pageSize) 
      .setMaxResults(pageSize+1) 
      .list(); 

    } 

    public List getNextPage() 

    public List getPreviousPage() 

    public int getPageCount() 

    public int getCurrentPage() 

    public void setPageSize() 

} 

Я не снабжали реализацию, но вы можете использовать методы, предложенные @Jon. Вот вам good discussion.

11

Скорее всего, в GridView вы захотите отобразить фрагмент данных и общее количество строк (количество строк) общего объема данных, соответствующих вашему запросу.

Вы должны использовать MultiQuery для отправки запроса Select count (*) и запросов .SetFirstResult (n) .SetMaxResult (m) в вашу базу данных за один раз.

Обратите внимание, что результатом будет список, содержащий 2 списка, один для среза данных и один для подсчета.

Пример:

IMultiQuery multiQuery = s.CreateMultiQuery() 
    .Add(s.CreateQuery("from Item i where i.Id > ?") 
      .SetInt32(0, 50).SetFirstResult(10)) 
    .Add(s.CreateQuery("select count(*) from Item i where i.Id > ?") 
      .SetInt32(0, 50)); 
IList results = multiQuery.List(); 
IList items = (IList)results[0]; 
long count = (long)((IList)results[1])[0]; 
31
public IList<Customer> GetPagedData(int page, int pageSize, out long count) 
     { 
      try 
      { 
       var all = new List<Customer>(); 

       ISession s = NHibernateHttpModule.CurrentSession; 
       IList results = s.CreateMultiCriteria() 
            .Add(s.CreateCriteria(typeof(Customer)).SetFirstResult(page * pageSize).SetMaxResults(pageSize)) 
            .Add(s.CreateCriteria(typeof(Customer)).SetProjection(Projections.RowCountInt64())) 
            .List(); 

       foreach (var o in (IList)results[0]) 
        all.Add((Customer)o); 

       count = (long)((IList)results[1])[0]; 
       return all; 
      } 
      catch (Exception ex) { throw new Exception("GetPagedData Customer da hata", ex); } 
     } 

При пейджинговой данных есть другой способ, чтобы получить набранный результат от многокритериальной или каждый делает то же самое, как и я?

Благодаря

87

Вы также можете воспользоваться преимуществами фьючерсных фигурировать в NHibernate, чтобы выполнить запрос, чтобы получить общий рекорд рассчитывать, а также фактические результаты в одном запросе.

Пример

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

хорошее обсуждение того, что фьючерсы дать вам here.

39

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

 Смежные вопросы

  • Нет связанных вопросов^_^