.NET Core API项目中的分页

Joh*_*ell 11 c# rest pagination asp.net-core

我正在尝试在.NET Core RESTfulAPI(with EF)上实现分页.

而不是重新发明轮子,我希望有一种方法可以使用一个可以挂钩到API处理程序的通用函数,并拦截请求将它们应用于EF查询结果或内置于.NET Core我不知道的内容.任何人都可以向我指出他们所知道的图书馆的大方向.NET Core

我之前做过这种方式(并且在非.NET Core应用程序中完成)的方法是创建一个函数,我必须将参数物理地添加到控制器函数(pageSize,pageNumber),这确实变得乏味(我觉得有点不整洁)将这两个参数添加到每个函数中.

Sir*_*ufo 13

没有内置功能远分页,如果你不喜欢它.想象一下,一个控制器方法返回1.000.000分页结果,只是为了从中选择10.由您来实现分页.

繁琐而不整洁的控制器方法就像

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

可以重组为

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 );
    }
}
Run Code Online (Sandbox Code Playgroud)

更改任何其他控制器方法以具有此类参数类并继承QueryArgsBase或实现IPaginationInfo以使用该QueryableExtensions.Paginate方法.