Ich frage mich, ob es eine Möglichkeit gibt, Seitenumbruch in C# gegen DocumentDB mit oder ohne ihren Linq-Provider zu implementieren?Seitenumbruch in C# gegen DocumentDB ohne Überspringen
Szenario: Ich habe eine API, die Paginierung unterstützt, sendet der Benutzer in der Seite, die sie mit einem pagesize auf zusammen aussehen wollen, wie zum Beispiel:
public virtual async Task<HttpResponseMessage> Get(int? page = DefaultPage, int? pageSize = DefaultPageSize)
ich dann diese Parameter verwenden, die Paginieren Daten in der Datenzugriffsschicht mit dem folgenden Code:
return query.Skip((pageNumber - 1) * pageSize).Take(pageSize);
„Was ist das Problem dann ist“, könnte man fragen. Nun, dieser Ansatz und Code funktioniert perfekt mit EF und SQL. Das Problem ist, dass ich DocumentDB verwenden möchte, aber ihre Linq-Implementierung hat keine Unterstützung für Skip. Die einzigen Beispiele, die ich gesehen habe, schließen die Verwendung des Schlüsselwortes TOP oder continuation tokens ein, das nicht passt gut mit mir, Benutzern erlaubend, eine pageNumber und pageSize einzuschicken.
Gibt es eine Implementierung, die es meinen Benutzern noch ermöglicht, pageNumber
und pageSize
in der Anforderung anzugeben?
Hallo Larry, Vielen Dank für Ihre Antwort, die wie klingt ein vernünftiges Argument zu machen. Obwohl ich nicht sehen kann, wie die Verwendung von Fortsetzungstokens und das Zwischenspeichern der Ergebnisse möglich ist, können meine Benutzer beliebige Kombinationen aus "Seite" und "Seitengröße" einsenden. Ja, der höchste Wert der Seite entspricht der Anzahl der Elemente in der Sammlung, obwohl es nicht "unmöglich" wäre, dies zusammen mit all den verschiedenen Kombinationen, die von den Kombinationen 'page' und' pageSize' geliefert werden, zu speichern. Beachten Sie, dass "pageSize" alles von 1 bis etwa 50 sein kann. –
Nehmen wir an, der Benutzer hat die Seitengröße auf 10 gesetzt und Sie haben 27 Zeilen im Cache. Daher hat der Cache nur genügend Zeilen für Seite 1, Seite 2 und einen Teil von Seite 3 im Speicher, wenn der Benutzer Seite 7 anfordert. Ihr Code würde berechnen, dass er mindestens 80 Zeilen im Cache haben muss, um Seite 7 und anzuzeigen Es wird so viele Zeilen mit dem Fortsetzungstoken aus der letzten Anfrage holen. Wenn der Benutzer dann auf Seite 5 zurückspringt, haben Sie diese bereits im Cache und müssen nicht auf DocumentDB zugreifen. In der Praxis können Sie 100 oder sogar 1000 Zeilen im zweistelligen Millisekunden erhalten. –
Vielen Dank für die Erklärung. Das klingt nach einer guten Strategie, zumal es so dynamisch ist, dass meine Benutzer die "pageSize" zwischen verschiedenen Anfragen ändern können. Ich denke, dass Sie den aufgebauten Cache auch in Anfragen für einzelne Ressourcen verwenden könnten, was nett ist. –