我正在尝试在 .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/