c# - .NET Core API 项目中的分页

标签 c# rest pagination asp.net-core

我正在尝试在 .NET Core RESTful API(使用 EF)上实现分页。

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

中执行此操作的库的总体方向吗?

我以前执行此操作的方法(并且在非 .NET Core 应用程序中执行过)是创建一个函数,我必须将参数物理添加到 Controller 函数(pageSize、pageNumber),这确实很乏味(而且我认为有点不整洁)将这两个参数添加到每个函数中。

最佳答案

没有内置的远分页功能,如果您不喜欢的话。想象一下,一个 Controller 方法返回 1.000.000 个分页结果,只是从中挑选 10 个。由您来实现分页。

繁琐且不整洁的 Controller 方法,例如

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 );
    }
}

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

关于c# - .NET Core API 项目中的分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43736000/

相关文章:

c# - @Html.DropDownList() 占位符为禁用和选中

c# - 我如何使用 asp.net 从另一个用户控件调用用户控件的方法?

node.js - 如何将我的 REST API 与我的 Express 网络应用分开?

java - 如何为 HTTP GET 的多个键值参数设计 REST URI

azure - 使用分页时的 Documentdb 性能

c# - 定义不同类型的二维动态数组

c# - Visual Studio 2022 for Mac 中未命中断点

rest - 用于创建和编辑表单的REST URL

javascript - 多重 ionic 卷轴,无限卷轴

node.js - 如何在nodejs + postgresql中实现分页