我的问题正是这个。但是,Azure 存储 API 已更改,我能找到的有关此问题的所有答案都涉及旧版本。如何处理在当前 API 版本中返回超过 1000 个项目的查询?获取少于 1000 个项目的查询如下所示:
var query = new TableQuery<TermScoreEntity>()
.Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, Name));
var table = _tableClient.GetTableReference("scores");
foreach (var termScoreEntity in table.ExecuteQuery(query))
result.Add(termScoreEntity.RowKey, termScoreEntity.Score);
您是否尝试过使用上述代码检索 1000 多个实体?我认为使用简单的ExecuteQuery
就足够了。
文档只说它对纯 REST 请求有 1,000 个限制,ExecuteQuery
API 内部使用此 rest API,但自动削减到多个请求,每个请求都有 1,000 个限制。
因此,如果您使用 .NET 包,则无需担心此限制,库已经为您处理了此问题。您可以参考此线程以获取更多信息。
下面是从 Azure SDK ExecuteQuery
的一些关键代码,如果不指定take
数字,你会发现实际上最大数字是9223372036854775807L
:
internal IEnumerable<DynamicTableEntity> Execute(CloudTableClient client, CloudTable table, TableRequestOptions requestOptions, OperationContext operationContext)
{
CommonUtility.AssertNotNullOrEmpty("tableName", table.Name);
TableRequestOptions modifiedOptions = TableRequestOptions.ApplyDefaults(requestOptions, client);
operationContext = operationContext ?? new OperationContext();
return CommonUtility.LazyEnumerable<DynamicTableEntity>((Func<IContinuationToken, ResultSegment<DynamicTableEntity>>) (continuationToken =>
{
TableQuerySegment<DynamicTableEntity> local_0 = this.ExecuteQuerySegmented((TableContinuationToken) continuationToken, client, table, modifiedOptions, operationContext);
return new ResultSegment<DynamicTableEntity>(local_0.Results)
{
ContinuationToken = (IContinuationToken) local_0.ContinuationToken
};
}), this.takeCount.HasValue ? (long) this.takeCount.Value : long.MaxValue);
}
您的代码看起来正确,并且看起来基本与 http://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-how-to-use-tables/#retrieve-all-entities 相同 - "如何:检索分区中的所有实体"
您确定该分区中有 1000 多个实体吗? 您可以通过几种不同的方式进行检查:
- 使用 Visual Studio 或其他一些存储资源管理器运行相同的查询,并查看获得的结果数。
- 在运行代码时使用 Fiddler,并查看响应中是否返回了继续标记。 如果有继续标记,则您使用的代码应自动遵循它们并创建新请求。 如果没有继续标记,则意味着没有更多与查询匹配的实体。