4

実装されていないAzure テーブル ストレージからコレクションを返す次のものがありますSkip。返される行数は約 500 です。

ICollection<City> a = cityService.Get("0001I");

私がやりたいことは、引数に応じて次の範囲だけが返されるようにすることです:

records 1-100           passing in 0   as an argument to a LINQ expression
records 101-200         passing in 100 as an argument to a LINQ expression
records 201-300         passing in 200 as an argument to a LINQ expression
records 301-400         passing in 300 as an argument to a LINQ expression
etc

上記に追加してリンクを使用して、これらの範囲のレコードを返す方法はありますか:

4

4 に答える 4

4

質問で既に述べたように、Skip メソッドは Windows Azure テーブル ストレージに実装されていません。これは、2 つのオプションが残っていることを意味します。

オプション1

テーブル ストレージからすべてのデータをダウンロードし (ToList を使用して、abatishchev の回答を参照)、この完全なリストで Skip メソッドと Take メソッドを実行します。あなたの質問では、500 レコードについて話しています。レコードの数があまり増えない場合は、このソリューションで問題ありません。すべてのレコードに同じパーティション キーがあることを確認してください。

データが大きくなった場合でもこのアプローチを使用できますが、テーブル ストレージからレコードを何度もロードするのではなく、すべてのレコードを格納するキャッシュ ソリューションを評価することをお勧めします (これによりパフォーマンスが向上しますが、これが機能するとは思わないでください)。非常に大量のデータを含む)。Windows Azure では、以下を使用してキャッシュが可能です。

オプション 2

CloudTableQuery クラスを使用すると、データのクエリを実行できますが、ページングの実装を構築するために継続トークンを受け取ることがより重要です。これにより、より多くのデータを照会できるかどうかを検出できます。Scott のブログ投稿 (nemensv のコメントを参照) のページネーションの例では、これが使用されています。

継続トークンの詳細については、Jim のブログ投稿Azure@home Part 7: Asynchronous Table Storage Paginationをご覧になることをお勧めします。継続トークンを使用すると、現在のページのデータのみをダウンロードできます。つまり、何百万ものレコードがある場合でも正しく機能します。ただし、継続トークンを使用することの欠点を知っておく必要があります。

  • これはそのままでは Skip メソッドでは機能しないため、解決策にはならない可能性があります。
  • ページの「番号」はありません。データが多いかどうかしか分からないためです (量ではありません)。
  • すべてのレコードをカウントする方法はありません
于 2012-06-25T10:57:28.147 に答える
0

ページングが基盤となるエンジンでサポートされていない場合、それを実装する唯一の方法は、すべてのデータをメモリにロードしてからページングを実行することです。

var list = cityService.Get("0001I").ToList(); // meterialize
var result = list.Skip(x).Take(y);
于 2012-06-25T07:33:53.210 に答える
-1

次のようなことを試してください:

cityService.Get("0001I").ToList().Skip(n).Take(100);

これにより、レコード 201 ~ 300 が返されます。

cityService.Get("0001I").ToList().Skip(200).Take(100);
于 2012-06-25T07:34:33.707 に答える
-1
a.AsEnumerable().Skip(m).Take(n)
于 2012-06-25T07:57:28.817 に答える