2017-05-02 7 views
4

.NET CoreRESTful APIの(EF)ページングを実装しようとしています。.NET Core APIプロジェクトでのページ設定

私はホイールを再発明するのではなく、APIハンドラにフックすることができる汎用関数を使用して、それをEFに適用する要求を傍受する方法があると願っていました。クエリ結果または.NET Coreに組み込まれたもの知らない誰でも私がこれを認識している図書館の一般的な方向に向けることができます.NET Core

私がこれまでにやっていた方法(そして.NET以外のコアアプリケーションで行った方法)は、物理的にコントローラ機能(pageSize、pageNumber)にパラメータを追加しなければなりません。この機能は、これらの2つのパラメータをすべての単一の機能に追加することが面倒です。

+1

EFには、 'Skip(int)'と 'Take(int)'の2つの便利なメソッドがあります。両方を組み合わせて、必要なページだけを取得することができます。 – Seididieci

+0

私が知る限り、何も組み込まれていません。しかし、私がいつもやったやり方は、リポジトリから返されるクラス(単純なアプリケーションの場合はリポジトリパターンを使用する場合)で、1つまたは2つのインタフェース(ソート、ページ設定用)を実装しています。このように、DbContext/IQueryableインターフェイスは、ドメインまたはアプリケーションレイヤに漏洩する必要はありません。 CQRSでは、特定のハンドラに対してコマンド/クエリを使用するため、これはまったく異なります – Tseng

答えて

6

ページングの機能があまりなく、あなたがそれを気に入らない場合は、組み込み機能はありません。コントローラメソッドが、ページングのために1.000.000の結果を返して、それらから10を選択するとします。ページネーションを実装するのはあなた次第です。

public class FooController : Controller 
{ 
    public IEnumerable<Foo> GetAll( 
     string Filter, 
     string Whatever, 
     ..., 
     int pageNumber = 1, 
     int pageSize = 20) 
    { ... } 
} 

面倒で乱雑制御方法は

public class FooController : Controller 
{ 
    public IEnumerable<Foo> GetAll(GetAllArgs args) 
    { 
     IQueryable<Foo> query = ... 

     return query.Paginate(args).ToList(); 
    } 

    public class GetAllArgs : QueryArgsBase 
    { 
     public string Filter { get; set; } 
     public string Whatever { get; set; } 
    } 
} 

public interface IPaginationInfo 
{ 
    int PageNumber { get; } 
    int PageSize { get; } 
} 

public abstract class QueryArgsBase : IPaginationInfo 
{ 
    public int PageNumber { get; set; } = 1; 
    public int PageSize { get; set; } = 20; 
} 

public static class QueryableExtensions 
{ 
    public static IQueryable<T> Paginate<T>( 
     this IQueryable<T> source, 
     IPaginationInfo pagination) 
    { 
     return source 
      .Skip((pagination.PageNumber - 1) * pagination.PageSize) 
      .Take(pagination.PageSize); 
    } 
} 

変更するQueryArgsBaseからそのような引数クラスとinheriteを持っているか、使用するIPaginationInfoを実装する任意の他の制御方法を再編成することができますQueryableExtensions.Paginate方法。

関連する問題