提问人:Anna 提问时间:10/22/2019 更新时间:6/25/2022 访问量:4521
如何在 ASP.NET Core 中编写服务器端分页代码
How to write code for Server side pagination in ASP.NET Core
问:
我想实现服务器端分页,用于加载一些我想加载到浏览器中的数据。它在 MVC 中使用 PageList 在客户端工作正常,但我不知道如何在核心服务器端 Asp.net 操作。
这是我的班级,我想展示所有 proporties,甚至照片(图片)
public class HouseDTO
{
[Key]
public int HouseId { get; set; }
public Nullable<decimal> Price { get; set; }
public string LiveArea { get; set; }
public string RoomAmount { get; set; }
public string HouseType { get; set; }
public string ImageName { get; set; }
}
然后是我的 Repisitory
public interface IHouseRepository
{
public IEnumerable<HouseDTO> GetAllHouses()
}
public class HouseRepository : IHouseRepository
{
private ApplicationDbContext db;
public HouseRepository(ApplicationDbContext db)
{
this.db = db;
}
public IEnumerable<HouseDTO> GetAllHouses()
{
return db.Houses;
}
}
这是我的控制器
public class AdvController : Controller
{
private IHouseRepository db;
private IHostingEnvironment hostingEnvirnment;
public AdvController(IHouseRepository db, IHostingEnvironment hostingEnvirnment)
{
this.db = db;
this.hostingEnvirnment = hostingEnvirnment;
}
public IActionResult Index()
{
var model = db.GetAllHouses(); // How can I do this to Server side pagination?
return View(model);
}
}
那么如何为此操作创建服务器端分页呢?
public IActionResult Index()
{
var model = db.GetAllHouses();
return View(model);
}
如果您帮助我,我将不胜感激。
答:
3赞
Ljubomir Bacovic
10/22/2019
#1
你可以使用 Skip() 和 Take()。创建一个存储库方法,该方法将采用当前位置(跳过)并将参数提供给 Take。像这样:
public House GetPaged(currentPosition)
{
return db.Houses.Skip(currentPosition).Take(20);
}
评论
1赞
madreflection
10/22/2019
但是,这不应该调用 ,因为这会将其从 减少到 ,这最终会在应用 和 db 之前提取所有记录。房子“(并公开方法而不是将其私有化)并且您很好。存储库是它更好的地方。db.GetAllHouses()
IQueryable<T>
IEnumerable<T>
Skip
Take. Change that to
0赞
Ljubomir Bacovic
10/22/2019
我敢肯定,使用存储库的服务类是存储此类业务逻辑的最佳位置。然后控制器应该使用服务方法,而不是直接使用存储库。
1赞
madreflection
10/22/2019
这不是我想要区分的。将此与 Dmytro 的答案进行比较,后者建议在控制器中执行此操作。这不好,因为它假设它不会返回一个具体化的集合。你的答案更好(我的观点的关键)。GetAllHouses
0赞
Ljubomir Bacovic
10/22/2019
明白了。谢谢。我想我正在尝试进一步改进它 - 做我会在我的代码中做的事情。
0赞
Ljubomir Bacovic
10/22/2019
编辑了我的答案,以包含@madreflection的建议
1赞
Dmytro
10/22/2019
#2
Take() 和 Skip() 对 db 的结果。房子是要走的路。
喜欢这个:
// Skip (n) pages and take (x) elements from required page.
return db.Houses.Skip(page*countPerPage).Take(countPerPage);
// As suggested in comments for the answer above, specified code should belong to
// repository method. Initially implemented as a template to be copypasted
// and reused according to your needs.
确保查询中的页码是从 0 开始的: 如果未指定页面,则 page = 0;page = 0 如果您需要页面 #1;page = 1 如果您需要页面 #2 等。countPerPage 的意义是显而易见的:)
评论
0赞
Anna
10/22/2019
感谢您的回复。我是这种员工的新手,请您告诉我更详细的做法吗?
0赞
Yannik
6/25/2022
#3
我可能有点晚了,但我写了一个轻量级包来解决这个问题,为您提供了使用 Skip() 和 Take() 构建数据库查询的工具包,正如其他答案所建议的那样。
这可能对谷歌搜索的人有所帮助:https://github.com/YannikG/dotnet-pageable-data
评论