2017-01-10 3 views
-1

Ich benutze PagedList.MVC nugget, und es dauert fast 10 Sekunden jedes Mal, wenn ich auf die nächste Schaltfläche geklickt habe. Ich habe gesehen, dass es in der PagedList etwa 350.000 Ergebnisse gibt und jedes Mal, wenn ich auf die nächste Schaltfläche klickte, durchläuft es alle Ergebnisse erneut. Wie soll ich das lösen?Wie Leistungsproblem lösen, wenn Paginierung in .net mvc?

Hier ist der Code.

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)); 
     } 
+1

Verwenden Sie keine 'Liste ' und '.ToList()' (das alle Datensätze in den Speicher geladen wird, bevor Sie die Paging tun –

+0

Sie Ihre gesamte Liste jedes Mal, wenn das Laden der Seite Cache. der Wert von 'items' in eine Eigenschaft Ihres Controllers (oder noch besser, Paging-Server-Seite implementieren). –

+0

@stephenmuecke Sie sollten es verwenden? –

Antwort

4

db.items.ToList(); lädt alle 350.000 Datensätze in den Speicher und dann auf, dass Sie filtern im Code. Sie müssen die Seitennummerierung der Datenbank mit .Skip() und .Take() durchführen.

Edit: Anscheinend PagedList.MVC dieser kümmert, Sie müssen es einfach nur zu halten, wie in IQueryable und nicht .ToList() nennen. Von 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(); 
    } 
} 
+0

'.ToPagedList()' verwendet '.Skip()' und '.Take()' :) –

+0

Sie sollten jedoch darauf achten, dass Sie den DbContext nicht vor der Ausführung von ToPagedList() löschen. – juunas

+0

Also, wenn ich Entity-Framework im ersten Modus DB verwenden. Wie sollte ich ein IQueryble bekommen? Ich habe versucht, var items = db.items; dann return View (items.ToPagedList (pageNumber, 25)); Es gibt einen Fehler Die Methode 'Skip' wird nur für sortierte Eingaben in LINQ to Entities unterstützt. Die Methode 'OrderBy' muss vor der Methode 'Skip' aufgerufen werden. @ Paul Abbott – Wilheim