【问题标题】:How to retrieve more than 1000 results from table storage?如何从表存储中检索超过 1000 个结果?
【发布时间】:2019-03-05 19:54:22
【问题描述】:

我们如何从表存储中检索更多 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 表存储,而不是 cosmosdb。

【问题讨论】:

    标签: c# .net azure-table-storage


    【解决方案1】:

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

    这个代码(在异步方法中会更好,等待任务)需要循环以获得所有结果:

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

    我希望您需要循环,将 previous 结果中的 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);
    

    【讨论】:

      【解决方案2】:

      默认情况下,Azure 表存储在给定时间仅返回 1000 条记录,因为您正在调用 ExecuteQuerySegmentedAsync(),您选择获取 1000 条记录并使用 continuationToken 获取下一组记录。相反,您可以使用ExecuteQuery(query); 这将返回所有预期的记录。如果您查看出站请求,您会看到 ExecuteQuery 正在通过发出多个请求为您在库中处理延续,直到所有记录都返回。

      改变这个:

      Task<TableQuerySegment<T>> translations = table.ExecuteQuerySegmentedAsync(treanslationsQuery, continuationToken);
      

      至此:

      var translations = table.ExecuteQueryAsync(treanslationsQuery);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多