从MSDN开始,查询服务返回的实体数量似乎有限制:
针对Table服务的查询一次最多可返回1,000个实体,并且最多可执行五秒。
但是当我写一个示例来展示这个问题时,我没有发现返回实体数量的任何限制,这是我的关键代码:
public class DataProvider
{
public static string PartitionKey
{
get { return "PartitionKey"; }
}
public static IEnumerable<CustomerEntity> MoreThanThousandData()
{
var result = new List<CustomerEntity>();
for (int i = 0; i < 1200; i++)
{
result.Add(new CustomerEntity(PartitionKey, Guid.NewGuid().ToString())
{
Name = Guid.NewGuid().ToString(),
Age = new Random().Next(10, 70)
});
}
return result;
}
}
将1200个实体插入表中:
public class AfterOptimize
{
public void InsertDataToTable()
{
var cloudData = DataProvider.MoreThanThousandData();
Console.WriteLine("Plan to insert {0} entities to the table.", cloudData.Count());
InsertDataToTableInternal(AzureTableService.Table, cloudData);
}
private void InsertDataToTableInternal(CloudTable table, IEnumerable<ITableEntity> data)
{
var splitedData = data.Chunk(100);
Parallel.ForEach(splitedData, item =>
{
var batchInsertOperation = new TableBatchOperation();
foreach (var tableEntity in item)
{
batchInsertOperation.Add(TableOperation.Insert(tableEntity));
}
table.ExecuteBatch(batchInsertOperation);
});
}
}
然后,从表中读取,分区键在这里都是相同的:
public void ReadCloudData()
{
InsertMoreThanOneThousandDataToTable();
var query =
new TableQuery<CustomerEntity>().Where(TableQuery.GenerateFilterCondition("PartitionKey",
QueryComparisons.Equal, DataProvider.PartitionKey));
var result = AzureTableService.Table.ExecuteQuery(query);
Console.WriteLine("Read {0} entities from table.", result.Count()); // output 1200
}
我只使用了最新的Azure存储.NET客户端API。
答案 0 :(得分:8)
我无法找到文档链接,但ExecuteQuery
方法在内部处理延续令牌,并将返回表格中的所有实体。因此,您所看到的行为是正确的。
如果在执行此代码时运行Fiddler,您会注意到向表服务发送了多个请求。第一个请求将没有延续令牌,但在后续请求中,您将看到NextPartitionKey
和NextRowKey
查询字符串参数。