ページングの機能があまりなく、あなたがそれを気に入らない場合は、組み込み機能はありません。コントローラメソッドが、ページングのために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
方法。
EFには、 'Skip(int)'と 'Take(int)'の2つの便利なメソッドがあります。両方を組み合わせて、必要なページだけを取得することができます。 – Seididieci
私が知る限り、何も組み込まれていません。しかし、私がいつもやったやり方は、リポジトリから返されるクラス(単純なアプリケーションの場合はリポジトリパターンを使用する場合)で、1つまたは2つのインタフェース(ソート、ページ設定用)を実装しています。このように、DbContext/IQueryableインターフェイスは、ドメインまたはアプリケーションレイヤに漏洩する必要はありません。 CQRSでは、特定のハンドラに対してコマンド/クエリを使用するため、これはまったく異なります – Tseng