如何从 table 存储中检索超过 1000 个结果?
How to retrieve more than 1000 results from table storage?
我们如何从 table 存储中检索更多 1000 个结果?
目前,此方法未检索到超过 1000 个结果:
public static List<Translation> Get<T>(string sourceParty, string destinationParty, string wildcardSourceParty, string tableName) where T : ITableEntity, new()
{
var acc = CloudStorageAccount.Parse(Environment.GetEnvironmentVariable("RosettaCacheStorageConnection"));
var tableClient = acc.CreateCloudTableClient();
var table = tableClient.GetTableReference(Environment.GetEnvironmentVariable("RosettaTableCache"));
TableQuery<T> treanslationsQuery = new TableQuery<T>().Where(
TableQuery.CombineFilters(
TableQuery.CombineFilters(
TableQuery.GenerateFilterCondition("sourceParty", QueryComparisons.Equal, sourceParty.ToLowerTrim()),
TableOperators.And,
TableQuery.GenerateFilterCondition("destinationParty", QueryComparisons.Equal, destinationParty.ToLowerTrim())
), TableOperators.Or,
TableQuery.CombineFilters(
TableQuery.GenerateFilterCondition("sourceParty", QueryComparisons.Equal, wildcardSourceParty),
TableOperators.And,
TableQuery.GenerateFilterCondition("destinationParty", QueryComparisons.Equal, destinationParty.ToLowerTrim()))
));
TableContinuationToken continuationToken = null;
Task<TableQuerySegment<T>> translations = table.ExecuteQuerySegmentedAsync(treanslationsQuery, continuationToken);
TableQuerySegment<T> translationss = translations.Result;
List<Translation> trans = translationss.Cast<Translation>().ToList();
return trans.Where(x => x.expireAt > DateTime.Now)
.Where(x => x.effectiveAt < DateTime.Now)
.ToList();
}
有没有办法检索更多 1000 个结果?
请记住,这是 Azure Table 存储,而不是 cosmosdb。
我没有使用过 Azure Table 存储(至少没有使用很长时间),但我怀疑问题在于您只进行了一次调用,传入了一个空的延续令牌,并且忽略结果中的继续标记。
这段代码(在等待任务的异步方法中会更好)需要循环才能获得所有结果:
TableContinuationToken continuationToken = null;
Task<TableQuerySegment<T>> translations = table.ExecuteQuerySegmentedAsync(treanslationsQuery, continuationToken);
TableQuerySegment<T> translationss = translations.Result;
我希望你需要循环,将 ContinuationToken
属性 从 previous 结果传递到 ExecuteQuerySegmentedAsync
方法,直到继续标记为 null 以指示结果结束。所以像:
var results = new List<T>();
TableContinuationToken continuationToken = null;
do
{
var response = await table.ExecuteQuerySegmentedAsync(treanslationsQuery, continuationToken);
continuationToken = response.ContinuationToken;
results.AddRange(response.Results);
} while (continuationToken != null);
默认情况下,Azure Table 存储在给定时间只会 return 1000 条记录,因为您正在调用 ExecuteQuerySegmentedAsync()
您选择获取 1000 条记录并使用 continuationToken 来获取下一组记录。相反,您可以使用 ExecuteQuery(query);
这将 return 所有预期的记录。如果您查看出站请求,您会看到 ExecuteQuery
正在通过发出多个请求为您处理库中的延续,直到所有记录都被 returned。
改变这个:
Task<TableQuerySegment<T>> translations = table.ExecuteQuerySegmentedAsync(treanslationsQuery, continuationToken);
为此:
var translations = table.ExecuteQueryAsync(treanslationsQuery);
我们如何从 table 存储中检索更多 1000 个结果?
目前,此方法未检索到超过 1000 个结果:
public static List<Translation> Get<T>(string sourceParty, string destinationParty, string wildcardSourceParty, string tableName) where T : ITableEntity, new()
{
var acc = CloudStorageAccount.Parse(Environment.GetEnvironmentVariable("RosettaCacheStorageConnection"));
var tableClient = acc.CreateCloudTableClient();
var table = tableClient.GetTableReference(Environment.GetEnvironmentVariable("RosettaTableCache"));
TableQuery<T> treanslationsQuery = new TableQuery<T>().Where(
TableQuery.CombineFilters(
TableQuery.CombineFilters(
TableQuery.GenerateFilterCondition("sourceParty", QueryComparisons.Equal, sourceParty.ToLowerTrim()),
TableOperators.And,
TableQuery.GenerateFilterCondition("destinationParty", QueryComparisons.Equal, destinationParty.ToLowerTrim())
), TableOperators.Or,
TableQuery.CombineFilters(
TableQuery.GenerateFilterCondition("sourceParty", QueryComparisons.Equal, wildcardSourceParty),
TableOperators.And,
TableQuery.GenerateFilterCondition("destinationParty", QueryComparisons.Equal, destinationParty.ToLowerTrim()))
));
TableContinuationToken continuationToken = null;
Task<TableQuerySegment<T>> translations = table.ExecuteQuerySegmentedAsync(treanslationsQuery, continuationToken);
TableQuerySegment<T> translationss = translations.Result;
List<Translation> trans = translationss.Cast<Translation>().ToList();
return trans.Where(x => x.expireAt > DateTime.Now)
.Where(x => x.effectiveAt < DateTime.Now)
.ToList();
}
有没有办法检索更多 1000 个结果?
请记住,这是 Azure Table 存储,而不是 cosmosdb。
我没有使用过 Azure Table 存储(至少没有使用很长时间),但我怀疑问题在于您只进行了一次调用,传入了一个空的延续令牌,并且忽略结果中的继续标记。
这段代码(在等待任务的异步方法中会更好)需要循环才能获得所有结果:
TableContinuationToken continuationToken = null;
Task<TableQuerySegment<T>> translations = table.ExecuteQuerySegmentedAsync(treanslationsQuery, continuationToken);
TableQuerySegment<T> translationss = translations.Result;
我希望你需要循环,将 ContinuationToken
属性 从 previous 结果传递到 ExecuteQuerySegmentedAsync
方法,直到继续标记为 null 以指示结果结束。所以像:
var results = new List<T>();
TableContinuationToken continuationToken = null;
do
{
var response = await table.ExecuteQuerySegmentedAsync(treanslationsQuery, continuationToken);
continuationToken = response.ContinuationToken;
results.AddRange(response.Results);
} while (continuationToken != null);
默认情况下,Azure Table 存储在给定时间只会 return 1000 条记录,因为您正在调用 ExecuteQuerySegmentedAsync()
您选择获取 1000 条记录并使用 continuationToken 来获取下一组记录。相反,您可以使用 ExecuteQuery(query);
这将 return 所有预期的记录。如果您查看出站请求,您会看到 ExecuteQuery
正在通过发出多个请求为您处理库中的延续,直到所有记录都被 returned。
改变这个:
Task<TableQuerySegment<T>> translations = table.ExecuteQuerySegmentedAsync(treanslationsQuery, continuationToken);
为此:
var translations = table.ExecuteQueryAsync(treanslationsQuery);