2008-09-10 9 views

答えて

107

ICriteriaは、取得したい最初の項目(基本的にページの最初のデータ行)のインデックスを示すSetFirstResult(int i)メソッドを持っています。

また、取得する行数(ページサイズ)を示すSetMaxResults(int i)メソッドがあります。私はあなたがページネーションに対処するための具体的な構造を作成することを示唆している

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

これはLinq(NHへの)構文がとにかくどのように見えるか - ニース。 – MotoWilliams

+13

ページャをレンダリングするには、行数の合計を取得するために別のトランザクションを実行する必要があることに注意してください。 –

+1

これは、SQL ServerでSELECT TOPクエリを実行します。 SetFirstResult(1).SetMaxResult(2);でそれを試してください。 –

23

Ayendeによってthis blog postで議論されているように、LinqをNHibernateに使うのはどうですか?

コードサンプル:

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

そして、ここでは、ページングを実装するなど、Data Access With NHibernateにNHibernateのチームのブログによる詳細な記事です。

+0

メモLINQはcontribのパッケージ内にあり、NHibernateの中に含まれていません2.0リリース – Richard

6

は例えば、この基準オブジェクトは、データグリッドの最初の10件の結果を取得します。ような何か(私は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には、データのスライスにクエリに一致したデータの総数(行数)を加えたものを表示する必要があります。

SelectQuery(*)クエリと.SetFirstResult(n).SetMaxResult(m)クエリを1回の呼び出しでデータベースに送信するには、MultiQueryを使用する必要があります。

結果は、データスライス用とカウント用の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); } 
     } 

データのページングが別のMultiCriteriaから入力された結果を取得する方法や、誰もが私と同じように同じことをしているのですか?あなたはまた、先物の利点を取ることができ

おかげ

87

は、総レコード数だけでなく、単一のクエリで実際の結果を得るためにクエリを実行するためにNHibernateのに備えています。先物は、あなたがhereで与えるものの

int iRowCount = rowCount.Value; 

良い議論:

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

例は、総レコード数を取得するには、次の操作を行います。

あなたはまた、明示的にこのようなあなたの結果注文したいことがありQueryOver

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

を使用することができますNHibernateは3で

+1

素晴らしいこと、ありがとう –

+3

これは素晴らしいことです。先物はマルチセレクションの文法的複雑さを伴わずにマルチセレクションとまったく同じように機能します。 – DavGarcia

+0

未来についての記事を読んだ後、私はすべてのデータベースクエリに未来を使うべきかどうか疑問に思った。欠点は何ですか? :) – hakksor

39

:NHibernateのに

var pageRecords = nhSession.QueryOver<TEntity>() 
      .OrderBy(t => t.AnOrderFieldLikeDate).Desc 
      .Skip(PageNumber * PageSize) 
      .Take(PageSize) 
      .List(); 
関連する問題