web-dev-qa-db-ja.com

ダッパー。ページング

Dapper ORMを試し、Postsテーブルを照会しています。

しかし、ページングされた結果を取得したい...

1-これを行うにはどうすればよいですか?これのヘルパーはありませんか?

2-Dapper QueryはIQueryableを返すことができますか?

ありがとう、ミゲル

47
Miguel Moura

1)Dapperには組み込みのページネーション機能がありません。ただし、クエリに直接実装するのはそれほど難しくありません。例:

SELECT  *
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY InsertDate) AS RowNum, *
          FROM      Posts
          WHERE     InsertDate >= '1900-01-01'
        ) AS result
WHERE   RowNum >= 1 // *your pagination parameters
    AND RowNum < 20  //*
ORDER BY RowNum

SQL Server 2005以降が必要

2)DapperはIEnumerable<T>を返します。

35
Alex

データベースまたはバージョンを指定しませんでした。新しいSQL Server 2012を使用してMSDNにアクセスできるという幸運があれば、光沢のある新しいOFFSETおよびFETCHキーワードを使用できます。次のクエリは20レコードをスキップし、次の5レコードを返します。

SELECT * FROM [Posts]
ORDER BY [InsertDate]
OFFSET 20 ROWS
FETCH NEXT 5 ROWS ONLY

詳細については http://msdn.Microsoft.com/en-us/library/ms188385(v = sql.110).aspx#Offset をご覧ください。

また、Massiveが行う方法をコピーして、IDbConnectionの独自の拡張メソッドを作成するのは簡単です。これがMassiveのコードです。

var query = string.Format("SELECT {0} FROM (SELECT ROW_NUMBER() OVER (ORDER BY {2}) AS Row, {0} FROM {3} {4}) AS Paged ", columns, pageSize, orderBy, TableName, where);
73
Jarrett Meyer

C#とDapperを使用した完全な作業バージョンを以下に示します。

/// <summary>
    /// Gets All People
    /// </summary>
    /// <returns>List of People</returns>
    public IEnumerable<Person> GetAllPeople(Pager pager)
    {
        var sql = (@" select * from [dbo].[Person]
                      order by [PeplNo]
                      OFFSET      @Offset ROWS 
                      FETCH NEXT  @Next   ROWS ONLY");

        using (IDbConnection cn = Connection)
        {
            cn.Open();

            var results = cn.Query<Person>(sql,pager);

            return results;
        }
    }


public class Pager
{
    public int Page { get; set; }
    public int PageSize { get; set; }

    public int Offset { get; set; }
    public int Next { get; set; }

    public Pager(int page, int pageSize = 10)
    {
        Page = page < 1 ? 1 : page;
        PageSize = pageSize < 1 ? 10 : pageSize;

        Next = pageSize;
        Offset = (Page - 1) * Next;
    }

}
3
Kbdavis07

Dapperのカスタムページングをデモし、並べ替え、条件、フィルターをサポートするサンプルプロジェクトを作成しました。

https://github.com/jinweijie/Dapper.PagingSample

基本的に、メソッドは次のようになります。

 Tuple<IEnumerable<Log>, int> Find(LogSearchCriteria criteria
        , int pageIndex
        , int pageSize
        , string[] asc
        , string[] desc);

最初の戻り値はアイテムリストです。 2番目の戻り値は合計カウントです。

それが役に立てば幸い。

ありがとう。

1
JIN Weijie