如何在 ASP.NET Core 中编写服务器端分页代码

How to write code for Server side pagination in ASP.NET Core

提问人:Anna 提问时间:10/22/2019 更新时间:6/25/2022 访问量:4521

问:

我想实现服务器端分页,用于加载一些我想加载到浏览器中的数据。它在 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);
}

如果您帮助我,我将不胜感激。

C# ASP.Net-Core 分页 服务器端

评论

0赞 Alexei Levenkov 10/22/2019
请注意,您需要做/知道的所有事情都已经涵盖了您可能在研究中看到的问题 - stackoverflow.com/questions/446196/...。一些澄清为什么这还不够,可以帮助有针对性的答案。

答:

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>SkipTake. 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