使用ExecuteQuerySegmentedAsync进行Azure表查询的需要示例

时间:2018-10-09 03:30:39

标签: c# azure azure-table-storage

我只是试图在Azure表中获取与某个字段名称匹配的所有实体,而且似乎找不到我可以学习的任何最新示例。

最终我想将结果显示在HTML表中以返回视图,所以我认为List<ActivityModel>会很有意义。要么是IEnumerable,因为我不需要更改任何实体(只需读取)。无论哪种方式,我都在努力应对基本概念。

public async Task<List<ActivityModel>> GetActivitiesAsync(string domainName)
    {
        CloudTable cloudTable = TableConnection("NodeEvents");
        TableQuery<ActivityModel> query = new TableQuery<ActivityModel>().Where(
            TableQuery.GenerateFilterCondition("DomainName", QueryComparisons.Equal, domainName)
        );

        //tried many examples of continuation tokens/etc
    }

我遇到的问题是,所有最新的SDK都使用ContinuationToken进行异步调用,而我似乎找不到任何好的示例。这似乎应该是一个简单的任务。任何帮助表示赞赏。

试图遵循here,但是示例引用了不再可用的方法和操作。

1 个答案:

答案 0 :(得分:0)

这对我有用。我什么都找不到,表明最近使用过Azure Tables SDK。希望这对其他人有用。这里还有更多注意事项:

  1. 该表有数千个实体,我总共只想要约500个。尽管下面的代码可以正常工作,但是在使用.Take(int)时还需要一些工作。据我了解,“ Take”方法只会限制每个查询返回多少记录。由于我可能要处理一个连续令牌,因此将其设置为5左右,则每个请求只需要5个实体,直到列表结尾。

  2. 我添加了一个索引计数器,以防万一我们获得了500条以上的记录,但是我的测试显示2000条以上的记录,而5000条以上的记录却没有,所以这可能是调用异步的结果吗? / p>

    public async Task<List<ActivityModel>> GetActivitiesAsync(string domainName)
    {
        List<ActivityModel> activities = new List<ActivityModel>();
        CloudTable cloudTable = TableConnection("NodeEvents");
        string filter = TableQuery.GenerateFilterCondition("DomainName", QueryComparisons.Equal, domainName);
        TableContinuationToken continuationToken = null;
    
        do
        {
            var result = await cloudTable.ExecuteQuerySegmentedAsync(new TableQuery<ActivityModel>().Where(filter), continuationToken);
            continuationToken = result.ContinuationToken;
            int index = 0;
            if (result.Results != null)
            {
                foreach (ActivityModel entity in result.Results)
                {
                    activities.Add(entity);
                    index++;
                    if (index == 500)
                        break;
                }
            }
    
        } while (continuationToken != null);
    
        return activities;
    }