たとえば、ASP.NET Webページのgridviewコントロールに、表示される行数に必要なデータのみを設定したいとします。どのようにNHibernateはこれをサポートできますか?NHibernateでページングを行うにはどうしたらいいですか?
答えて
ICriteria
は、取得したい最初の項目(基本的にページの最初のデータ行)のインデックスを示すSetFirstResult(int i)
メソッドを持っています。
また、取得する行数(ページサイズ)を示すSetMaxResults(int i)
メソッドがあります。私はあなたがページネーションに対処するための具体的な構造を作成することを示唆している
criteria.SetFirstResult(0).SetMaxResults(10);
Ayendeによってthis blog postで議論されているように、LinqをNHibernateに使うのはどうですか?
コードサンプル:
(from c in nwnd.Customers select c.CustomerID)
.Skip(10).Take(10).ToList();
そして、ここでは、ページングを実装するなど、Data Access With NHibernateにNHibernateのチームのブログによる詳細な記事です。
メモLINQはcontribのパッケージ内にあり、NHibernateの中に含まれていません2.0リリース – Richard
:
は例えば、この基準オブジェクトは、データグリッドの最初の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があります。
ほとんどの場合、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];
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から入力された結果を取得する方法や、誰もが私と同じように同じことをしているのですか?あなたはまた、先物の利点を取ることができ
おかげ
は、総レコード数だけでなく、単一のクエリで実際の結果を得るためにクエリを実行するために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>();
例は、総レコード数を取得するには、次の操作を行います。
あなたはまた、明示的にこのようなあなたの結果注文したいことがありQueryOvervar pageRecords = nhSession.QueryOver<TEntity>()
.Skip(PageNumber * PageSize)
.Take(PageSize)
.List();
を使用することができますNHibernateは3で
:NHibernateのに
var pageRecords = nhSession.QueryOver<TEntity>()
.OrderBy(t => t.AnOrderFieldLikeDate).Desc
.Skip(PageNumber * PageSize)
.Take(PageSize)
.List();
- 1. NHibernateでCriteria APIを使ってカスタムプロジェクションを行うにはどうしたらいいですか? HQLで
- 2. ブログのページでページングを行うにはどうすればいいですか?
- 3. NHibernateでリンクされた行を効率的に取り出すにはどうしたらいいですか?
- 4. JRubyで構文ハイライトを行うにはどうしたらいいですか?
- 5. Xcode 8.2.1でこれを行うにはどうしたらいいですか?
- 6. HaskellでHTTPSリクエストを行うにはどうしたらいいですか?
- 7. キュウリセレン(オートメーション)プロジェクトでペアリングを行うにはどうしたらいいですか?
- 8. glutinでウィンドウのオーバーライドリダイレクトを行うにはどうしたらいいですか?
- 9. clojure/ringでhttpコールを行うにはどうしたらいいですか?
- 10. NetbeansでC++ユニットテストを行うにはどうしたらいいですか?
- 11. Xcode 4でリモートデバッグを行うにはどうしたらいいですか?
- 12. ハイドープでマップ配置を行うにはどうしたらいいですか?
- 13. プログラムでワンリングコールを行うにはどうしたらいいですか?
- 14. nodejsアプリケーションでユニットテストを行うにはどうしたらいいですか?
- 15. UISplitViewにアニメーションスイッチを行うにはどうしたらいいですか?
- 16. PHPでコード行を減らすにはどうしたらいいですか?
- 17. カスタム方向ロックを行うにはどうしたらいいですか?
- 18. ExoPlayer2 - HTTP 301リダイレクトを行うにはどうしたらいいですか?
- 19. カーネルスレッドの通信を行うにはどうしたらいいですか?
- 20. Ionic InAppBrowserの統合を行うにはどうしたらいいですか?
- 21. NHibernate 3.2 - Log4Netなしでログを有効にするにはどうしたらいいですか?
- 22. ブートストラップを使うにはどうしたらいいですか?
- 23. 流暢NHibernateでフィルタリングされたインデックスを作成するにはどうしたらいいですか?
- 24. 新しいタブで開くのではなく、エコーポップアップを行うにはどうしたらいいですか?
- 25. IdleでPythonを実行するにはどうしたらいいですか?
- 26. エディタでmongodbを実行するにはどうしたらいいですか?
- 27. nHibernateで永続性とはどういう意味ですか?
- 28. NHibernateでどのようにネストされたトランザクションを行うのですか?
- 29. RubyでASCIIからEBCDICへの変換を行うにはどうしたらいいですか?
- 30. どうしたらいいですか?
これはLinq(NHへの)構文がとにかくどのように見えるか - ニース。 – MotoWilliams
ページャをレンダリングするには、行数の合計を取得するために別のトランザクションを実行する必要があることに注意してください。 –
これは、SQL ServerでSELECT TOPクエリを実行します。 SetFirstResult(1).SetMaxResult(2);でそれを試してください。 –