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方法.
| 归档时间: |
|
| 查看次数: |
6464 次 |
| 最近记录: |