【问题标题】:How to solve performance issue when pagination in .net mvc?在.net mvc中分页时如何解决性能问题?
【发布时间】:2017-05-25 12:26:11
【问题描述】:

我正在使用 PagedList.MVC nuget, 每次我点击下一个按钮都需要将近 10 秒的时间。 我已经看到 PagedList 中有大约 350,000 个结果,每次单击下一个按钮时,它都会再次遍历所有结果。我该如何解决这个问题?

这是代码。

public ActionResult Index(int? page)
        {
            List<Item> items;
            using (var db = new DBDevEntities())
            {
                items= db.items.ToList(); 
            }

            var pageNumber = page ?? 1;

            return View(items.ToPagedList(pageNumber, 25));
        }

【问题讨论】:

  • 不要使用List&lt;Item&gt;和.ToList()(即在进行分页之前将所有记录加载到内存中
  • 您每次翻页时都会加载整个列表。将items 的值缓存到控制器的属性中(或者更好的是,实现分页服务器端)。
  • @stephenmuecke 你应该使用它吗?
  • @SoheilAlizadeh,用什么? (必须是IQueryable&lt;T&gt;,而不是List&lt;T&gt;)
  • @stephenmuecke 我的意思是使用其他框架。

标签: c# .net asp.net-mvc pagination pagedlist


【解决方案1】:

db.items.ToList(); 正在将所有 350,000 条记录加载到内存中,然后您在代码中对其进行过滤。您需要使用.Skip() 和.Take() 进行分页数据库端。

编辑:显然 PagedList.MVC 会处理这个问题,您只需将其保留在 IQueryable 中,而不是调用 .ToList()。来自https://github.com/TroyGoode/PagedList:

public class ProductController : Controller
{
    public object Index(int? page)
    {
        var products = MyProductDataSource.FindAllProducts(); //returns IQueryable<Product> representing an unknown number of products. a thousand maybe?

        var pageNumber = page ?? 1; // if no page was specified in the querystring, default to the first page (1)
        var onePageOfProducts = products.ToPagedList(pageNumber, 25); // will only contain 25 products max because of the pageSize

        ViewBag.OnePageOfProducts = onePageOfProducts;
        return View();
    }
}

【讨论】:

  • .ToPagedList() 正在使用 .Skip() 和 .Take() :)
  • 您应该注意不要在运行 ToPagedList() 之前处理 DbContext。
  • 所以如果我在 db first 模式下使用实体框架。我应该如何获得 IQueryble?我试过 var items= db.items;然后返回 View(items.ToPagedList(pageNumber, 25));出现错误 LINQ to Entities 中的排序输入仅支持“跳过”方法。必须在方法“Skip”之前调用方法“OrderBy”。 @保罗雅培
猜你喜欢
  • 2011-04-06
  • 1970-01-01
  • 2021-07-26
  • 2011-05-18
  • 1970-01-01
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多