この記事では、フィルタリング、並べ替え、合計結果セット、マルチテーブルクエリ、および非ストアドプロシージャをサポートするDapperに基づくページング効果を主に詳しく紹介します。興味のある友人はそれを参照できます
。はじめに
Dapper ページングの実装については、事前にブログを検索しました。いくつかありますが、ストアド プロシージャに基づいているか、ページングをサポートしているがソートをサポートしていない、または検索条件を維持するのがそれほど簡単ではありません。
メソッド定義
以下は私のページング実装です (where 条件と SQL ステートメントのマッチングを考慮しているため) が、比較的普遍的であると考えられます。
public Tuple<IEnumerable<Log>, int> Find(LogSearchCriteria criteria , int pageIndex , int pageSize , string[] asc , string[] desc);
上記の関数定義は、Log をクエリする例です。返される結果では、Tuple の最初の値が結果セットで、2 番目の値が合計行数です (たとえば、合計 100 レコードがあります)。ページごとに 10 レコード、現在の最初のページ、最初の値は 10 レコード、2 番目の値は 100)
サンプル プロジェクトでは、2 つの方法でページネーションを実装しました:
1。最初のものは 2 this に基づいています。クエリでは、最初に合計数を取得し、2 回目のクエリでは結果セットを取得します。
2. 2 番目の実装は、このクエリに基づいており、SqlServer の Offest/Fetch を使用するため、Sql Server 2012 以降のみをサポートするため、使用する SQL Server のバージョンに応じて異なる実装を選択できます。これはもちろん 2 番目の実装です。もう少し効率的です。
サンプルを実行します
1. Github リポジトリをローカルにダウンロードまたはクローンした後、Database ディレクトリに移動し、Database.7z を解凍します
2。デフォルトでは、Sql Server LocalDB を使用しており、接続文字列は Data Source=(localdb)MSSQLLocalDB;Initial Catalog=DapperPagingSample;integrated security=True; です。 LocalDB を使用していない場合は、App.Config の接続文字列を適切に変更してください。 。
3. Ctrl+F5 を押してプログラムを実行します。サンプル プロジェクトでは、単純な WinForm プログラムを使用しましたが、ページング効果をより適切に示すことができるはずです。
複数テーブルのサポート
たとえば、2 つの Log テーブル、Level テーブルがあり、Log の LevelId フィールドは次のように Level の Id フィールドを参照します。クエリ、複数のテーブルを実装可能 クエリのページング、並べ替え、フィルタリング:
1 つ目は 2 回クエリを実行する例です (基本的にすべてのバージョンの SQL Server をサポートします):
public Tuple<IEnumerable<Log>, int> Find(LogSearchCriteria criteria , int pageIndex , int pageSize , string[] asc , string[] desc) { using (IDbConnection connection = base.OpenConnection()) { const string countQuery = @"SELECT COUNT(1) FROM [Log] l INNER JOIN [Level] lv ON l.LevelId = lv.Id /**where**/"; const string selectQuery = @" SELECT * FROM ( SELECT ROW_NUMBER() OVER ( /**orderby**/ ) AS RowNum, l.*, lv.Name as [Level] FROM [Log] l INNER JOIN [Level] lv ON l.LevelId = lv.Id /**where**/ ) AS RowConstrainedResult WHERE RowNum >= (@PageIndex * @PageSize + 1 ) AND RowNum <= (@PageIndex + 1) * @PageSize ORDER BY RowNum"; SqlBuilder builder = new SqlBuilder(); var count = builder.AddTemplate(countQuery); var selector = builder.AddTemplate(selectQuery, new { PageIndex = pageIndex, PageSize = pageSize }); if (!string.IsNullOrEmpty(criteria.Level)) builder.Where("lv.Name= @Level", new { Level = criteria.Level }); if (!string.IsNullOrEmpty(criteria.Message)) { var msg = "%" + criteria.Message + "%"; builder.Where("l.Message Like @Message", new { Message = msg }); } foreach (var a in asc) { if(!string.IsNullOrWhiteSpace(a)) builder.OrderBy(a); } foreach (var d in desc) { if (!string.IsNullOrWhiteSpace(d)) builder.OrderBy(d + " desc"); } var totalCount = connection.Query<int>(count.RawSql, count.Parameters).Single(); var rows = connection.Query<Log>(selector.RawSql, selector.Parameters); return new Tuple<IEnumerable<Log>, int>(rows, totalCount); } }
2 つ目の例は、Offset/Fetch を介したクエリです (SQL をサポートします)サーバー 2012+)
rree以上がDapper を使用してページング効果を実現する方法のチュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。