从 Azure Table 存储中获取超过 1000 个数据集
Get more than 1000 datasets from an Azure Table Storage
我有一个 Azure 函数可以对 Azure Table 存储中的数据集执行一些操作。
由于分组在 Azure Table 存储中不起作用,我必须在我的 table 中获取所有数据集并在我的 C# 代码中执行我想要的操作(分组、过滤)。
但是每个查询只检索前 1000 个数据集。
我怎样才能得到我所有的数据集 - 或者以 1000 为一组遍历 table 以得到最后的所有数据集?
TableQuery<Models.product_item> query = new TableQuery<Models.product_item>()
.Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, myPartitionKey));
var queryResult = myTable.ExecuteQuery(query);
你不能。可能是为了避免长 运行 查询。
还有其他限制,您可以在此处阅读:https://docs.microsoft.com/en-us/rest/api/storageservices/Query-Timeout-and-Pagination?redirectedfrom=MSDN
如果您的查询未在特定限制内完成(最多 5 秒,最多 1000 行,请参阅 here),您将在结果对象中收到 ContinuationToken
。将此标记传递给另一个查询以继续您的第一个查询并获取下一组行。
此扩展方法为您完成工作:
public static class QueryExtensions
{
public static async Task<IEnumerable<TElement>> ExecuteQueryAllElementsAsync<TElement>(this CloudTable table, TableQuery<TElement> tableQuery)
where TElement : ITableEntity, new()
{
TableContinuationToken continuationToken = default(TableContinuationToken);
var results = new List<TElement>(0);
tableQuery.TakeCount = 500;
do
{
//Execute the next query segment async.
var queryResult = await table.ExecuteQuerySegmentedAsync(tableQuery, continuationToken);
//Set exact results list capacity with result count.
results.Capacity += queryResult.Results.Count;
results.AddRange(queryResult.Results);
continuationToken = queryResult.ContinuationToken;
} while (continuationToken != null);
return results;
}
}
然后你可以像
一样在你的代码中使用它
var queryResult = await myTable.ExecuteQueryAllElementsAsync(query);
我有一个 Azure 函数可以对 Azure Table 存储中的数据集执行一些操作。
由于分组在 Azure Table 存储中不起作用,我必须在我的 table 中获取所有数据集并在我的 C# 代码中执行我想要的操作(分组、过滤)。
但是每个查询只检索前 1000 个数据集。 我怎样才能得到我所有的数据集 - 或者以 1000 为一组遍历 table 以得到最后的所有数据集?
TableQuery<Models.product_item> query = new TableQuery<Models.product_item>()
.Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, myPartitionKey));
var queryResult = myTable.ExecuteQuery(query);
你不能。可能是为了避免长 运行 查询。
还有其他限制,您可以在此处阅读:https://docs.microsoft.com/en-us/rest/api/storageservices/Query-Timeout-and-Pagination?redirectedfrom=MSDN
如果您的查询未在特定限制内完成(最多 5 秒,最多 1000 行,请参阅 here),您将在结果对象中收到 ContinuationToken
。将此标记传递给另一个查询以继续您的第一个查询并获取下一组行。
此扩展方法为您完成工作:
public static class QueryExtensions
{
public static async Task<IEnumerable<TElement>> ExecuteQueryAllElementsAsync<TElement>(this CloudTable table, TableQuery<TElement> tableQuery)
where TElement : ITableEntity, new()
{
TableContinuationToken continuationToken = default(TableContinuationToken);
var results = new List<TElement>(0);
tableQuery.TakeCount = 500;
do
{
//Execute the next query segment async.
var queryResult = await table.ExecuteQuerySegmentedAsync(tableQuery, continuationToken);
//Set exact results list capacity with result count.
results.Capacity += queryResult.Results.Count;
results.AddRange(queryResult.Results);
continuationToken = queryResult.ContinuationToken;
} while (continuationToken != null);
return results;
}
}
然后你可以像
一样在你的代码中使用它var queryResult = await myTable.ExecuteQueryAllElementsAsync(query);