ホームページ  >  記事  >  バックエンド開発  >  Dapper を使用してページング効果を実現する方法のチュートリアル

Dapper を使用してページング効果を実現する方法のチュートリアル

巴扎黑
巴扎黑オリジナル
2018-05-24 16:47:054334ブラウズ

この記事では、フィルタリング、並べ替え、合計結果セット、マルチテーブルクエリ、および非ストアドプロシージャをサポートする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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。