如何从表存储中检索超过1000条结果?

l--*_*''' 1 .net c# azure-table-storage

我们如何从表存储中检索更多 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();
}
Run Code Online (Sandbox Code Playgroud)

有没有办法检索超过 1000 个结果?

请记住,这是 Azure 表存储,而不是 cosmosdb。

Jon*_*eet 5

我没有使用过 Azure 表存储(至少很长一段时间没有使用过),但我怀疑问题是您只进行了一次调用,传入了一个空继续令牌,并忽略了结果中的继续令牌。

需要循环此代码(在异步方法中等待任务会更好)才能获取所有结果:

TableContinuationToken continuationToken = null;
Task<TableQuerySegment<T>> translations = table.ExecuteQuerySegmentedAsync(treanslationsQuery, continuationToken);
TableQuerySegment<T> translationss = translations.Result;
Run Code Online (Sandbox Code Playgroud)

我希望您需要循环,将ContinuationToken属性从前一个结果传递到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);
Run Code Online (Sandbox Code Playgroud)