Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从表存储中检索1000多个结果?_C#_.net_Azure Table Storage - Fatal编程技术网

C# 如何从表存储中检索1000多个结果?

C# 如何从表存储中检索1000多个结果?,c#,.net,azure-table-storage,C#,.net,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.Par

如何从表存储中检索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

我已经很久没有使用Azure表存储了,但我怀疑问题在于您只进行了一次调用,传入了一个空的延续令牌,并忽略了结果中的延续令牌

此代码最好使用异步方法,等待任务需要循环以获得所有结果:

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

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

更改此项:

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);
Task<TableQuerySegment<T>> translations = table.ExecuteQuerySegmentedAsync(treanslationsQuery, continuationToken);
var translations = table.ExecuteQueryAsync(treanslationsQuery);