在MVC中使用自定义逻辑对大量数据进行分页

本文关键字:数据 分页 MVC 自定义 | 更新日期: 2023-09-27 18:04:01

我想在MVC中实现对大量数据(DB有2 - 300万条记录)的分页,搜索,排序。在MVC中使用默认分页选项(使用PagedList.Mvc, @Html.PagedListPager)时,所有记录都为DB &页面上只显示100条记录。那很费时间& &;使用更多内存

我如何在MVC中实现自定义逻辑,每页只检索确切的100条记录?目前我正在尝试两种方法(使用EF和SP)。

我已经使用EF &SP并实现默认分页。但这两种方法都从数据库中检索所有记录;然后在客户端应用分页。那太浪费时间了。

public ActionResult Index(int? page) { 
      return View(db.TestUploadData2.ToList().ToPagedList(page ?? 1, 100));
 }

有什么建议吗?

在MVC中使用自定义逻辑对大量数据进行分页

你遇到的问题是,你把所有的东西从数据库拉到c#内存和然后只得到你想要显示的。

db.TestUploadData2.ToList() .ToList()是从数据库中获取的,所以你想把你的资格放在它之前。

你应该这样做:

public IEnumerable<TestUploadData2> GetPagedData(string prop1SearchValue,
                                                 string prop2SearchValue,
                                                 int pageNum = 1,
                                                 int pageSize = 20)
{
    var data = db.TestUploadData2;
    // No idea what your properties are, so I'll just wing with strings.
    if (!string.IsNullOrWhitespace(prop1SearchValue))
    {
        data = data.Where(d => d.Prop1 == prop1SearchValue);
    }
    // Did it like this so you can see how to conditionally filter the query
    if (!string.IsNullOrWhitespace(prop2SearchValue))
    {    
        data = data.Where(d => d.Prop2 == prop2SearchValue);
    }
               // If it is the first page, then 0 * pageSize,
               // second page, skip 1 * pageSize, etc.
    return data.Skip((pageNum - 1) * pageSize)
               // Take only what is being asked for.
               .Take(pageSize)
               // NOW pull it from the database.
               .ToList();
}

以下是使用PagedList.Mvc的正确方法。

public ViewResult Index(int? page)
{
   int pageSize = 100;
   int pageNumber = (page ?? 1);
   return View(db.TestUploadData2.ToPagedList(pageNumber, pageSize));
}

你可以阅读更多关于分页与实体框架文章。