Was ist die beste Praxis für die Paginierung in Entity Framework? Sollte man zweimal auf die Datenbank zugreifen, einmal, um die Gesamtzahl der Datensätze zu erhalten, und einmal, um die Datensätze zu erhalten? Vielen Dank im Voraus.
Antworten
Zu viele Anzeigen?Eine Lösung wäre die Verwendung einer LINQ-Abfrage, die die Operatoren Skip und Take verwendet.
Beispiel - Seite 1:
someObject.Skip(0).Take(10)
Beispiel - Seite 2:
someObject.Skip(10).Take(10)
Dann können Sie eine Variable für die Seitengröße definieren und diese als Parameter für den Befehl Take
y Skip (page size variable * (page number - 1))
Betreiber.
Und ja, ein Treffer, um die Gesamtzahl der Datensätze zu erhalten, um die Gesamtzahl der Seiten zu erhalten.
Die Paginierung wird wahrscheinlich auch mit dynamischer Filterung und Sortierung einhergehen. Eine saubere Art, mit dieser Situation umzugehen, besteht darin, die gesamte Ergebnismenge und die zugehörigen Metadaten (Seitengröße, aktuelle Seitenzahl usw.) in einer Klasse zu kapseln. EntityFrameworkPaginate ist ein Nuget-Paket, das eine elegante Lösung für den Seitenumbruch bietet. Es funktioniert so, dass Sie Ihre dynamische Filterung und Sortierung einrichten und eine Seite Objekt als Ergebnis, das das Ergebnis zusammen mit den Metadaten enthält. (CurrentPage, PageCount, PageSize, RecordCount und Results).
Wenn Sie dynamische Filter haben, die auf separaten Bedingungen beruhen, können Sie ein Filters-Objekt erstellen. Fügen Sie den Filterausdruck und die Bedingung zum Filterobjekt hinzu.
var filters = new Filters<Employee>();
filters.Add(!string.IsNullOrEmpty(searchText), x => x.LoginID.Contains(searchText));
filters.Add(!string.IsNullOrEmpty(jobTitle), x => x.JobTitle.Equals(jobTitle));
Richten Sie auf ähnliche Weise Ihre dynamische Sortierung in der Sortiert Objekt.
var sorts = new Sorts<Employee>();
sorts.Add(sortBy == 1, x => x.BusinessEntityID);
sorts.Add(sortBy == 2, x => x.LoginID, true);
Rufen Sie nun die Paginate-Erweiterungsmethode für Ihren Datenbanksatz auf, um die paginierten Ergebnisse zu erhalten.
context.Employees.Paginate(currentPage, pageSize, sorts, filters);
Dieser Ansatz reduziert den Code, den Sie schreiben müssen, ohne dass dies Auswirkungen auf die Leistung hat. Ein ausführliches Beispiel ist aquí in dem Link.