Dapper ORMを試し、Postsテーブルを照会しています。
しかし、ページングされた結果を取得したい...
1-これを行うにはどうすればよいですか?これのヘルパーはありませんか?
2-Dapper QueryはIQueryableを返すことができますか?
ありがとう、ミゲル
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>
を返します。
データベースまたはバージョンを指定しませんでした。新しい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);
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;
}
}
Dapperのカスタムページングをデモし、並べ替え、条件、フィルターをサポートするサンプルプロジェクトを作成しました。
https://github.com/jinweijie/Dapper.PagingSample
基本的に、メソッドは次のようになります。
Tuple<IEnumerable<Log>, int> Find(LogSearchCriteria criteria
, int pageIndex
, int pageSize
, string[] asc
, string[] desc);
最初の戻り値はアイテムリストです。 2番目の戻り値は合計カウントです。
それが役に立てば幸い。
ありがとう。