ストレージ SDK の Take メソッドは、LINQ のようには機能しません。次のようなことをすると想像してください。
TableQuery<TableEntity> query = new TableQuery<TableEntity>()
.Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "temp"))
.Take(5);
var result = table.ExecuteQuery(query);
反復を開始すると、result
最初は 5 つのアイテムしか得られません。しかし、その下で、 を反復し続けるresult
と、SDK はテーブルのクエリを続けます (そして、5 つの項目の次の「ページ」に進みます)。
テーブルに 5000 個のアイテムがある場合、このコードは 5000 個のアイテムすべてを出力します (そして、SDK の下で 1000 個のリクエストを実行し、リクエストごとに 5 個のアイテムをフェッチします)。
TableQuery<TableEntity> query = new TableQuery<TableEntity>()
.Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "temp"))
.Take(5);
var result = table.ExecuteQuery(query);
foreach (var item in result)
{
Trace.WriteLine(item.RowKey);
}
次のコードは、1 回のリクエストで正確に 5 個のアイテムを取得し、そこで停止します。
TableQuery<TableEntity> query = new TableQuery<TableEntity>()
.Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "temp"))
.Take(5);
var result = table.ExecuteQuery(query);
int index = 0;
foreach (var item in result)
{
Console.WriteLine(item.RowKey);
index++;
if (index == 5)
break;
}
実際には、Take()メソッドはページ サイズまたは「テイク カウント」( TableQueryの TakeCountプロパティ) を設定します。ただし、必要なレコードが 5 つだけの場合は、時間どおりに反復を停止するかどうかはあなた次第です。
あなたの例では、TakeCount (Take を呼び出して設定したもの) に達したときに停止するように while ループを変更する必要があります。
while (entryList.Count < query.TakeCount && (currentSegment == null || currentSegment.ContinuationToken != null))
{
currentSegment = table.ExecuteQuerySegmented(query, currentSegment != null ? currentSegment.ContinuationToken : null);
entryList.AddRange(currentSegment.Results);
}