C#でLinqプロバイダの有無にかかわらずDocumentDBに対してページ作成を実装する方法があるのだろうか?C#でスキップせずにDocumentDBに対して
シナリオ:
public virtual async Task<HttpResponseMessage> Get(int? page = DefaultPage, int? pageSize = DefaultPageSize)
私は、ページ付けし、それらのパラメータを使用します。私は、ページネーションをサポートAPIを持って、ユーザーは、彼らのような、pageSizeを一緒に見たいページに送信します次のコードでデータアクセス層のデータ:
return query.Skip((pageNumber - 1) * pageSize).Take(pageSize);
は「その問題は何ですか?」、あなたは尋ねるかもしれません。 EFとSQLを使用している間、この手法とコードは完全に機能します。問題は、DocumentDBの使用を開始したいが、Linq実装ではSkipをサポートしていないことです。私が見た唯一の例は、TOPキーワード、またはを使用して、ではなく、が私によく合い、pageNumberとpageSizeで送信できるようにしています。
要求にpageNumber
とpageSize
を提供できる実装はありますか?
こんにちはラリー、 は、あなたの答えをありがとう、合理的な引数を作ることのように聞こえる:ここに私のソリューションです。私はどのように継続トークンを使用してキャッシングを見ることができませんが、私のユーザが 'page'と' pageSize'の組み合わせを送ることができれば、結果は実現可能です。 はい、ページの最高値はコレクション内のアイテムの数と等しくなりますが、 'page'と' pageSize'コンボによって得られたすべての異なる組み合わせと一緒にこれをキャッシュするのは「不可能」ではないでしょうか? 'pageSize'は1から約50までの全てであることに注意してください。 –
ユーザがページサイズを10に設定し、キャッシュ内に27行を持っているとしましょう。したがって、キャッシュには、ユーザーがページ7を要求したときに、ページ1、ページ2、およびページ3の一部だけがメモリに格納されます。コードでは、ページ7を表示するためにキャッシュに少なくとも80行が必要であると計算されます。最後のリクエストからの継続トークンを使用してその行を多数取得します。その後、ユーザーが5ページ目に戻ってきたら、すでにキャッシュに保存されているので、DocumentDBを押す必要はありません。実際には、2桁のミリ秒単位で100または1000の行を取得することができます。 –
ありがとうございます。これは良い戦略のように思えます。特に、ユーザーがさまざまなリクエスト間で 'pageSize 'を変更できるように十分に動的であるためです。私はあなたが単一のリソースの要求で構築されたキャッシュを使用することもできたと思います。これは素晴らしいことです。 –