c# - 查询azure表服务给出不同的结果

标签 c# azure azure-storage

我正在尝试使用 Microsoft Azure 存储 SDK 查询 azure 表存储。发送简单请求会返回预期结果(类似于 https://learn.microsoft.com/en-us/azure/storage/storage-dotnet-how-to-use-tables#retrieve-a-range-of-entities-in-a-partition )。但是当我发送像这样的更复杂的查询时:

  (((((((((PartitionKey eq 'LOS-test1-20161218') or (PartitionKey eq 'SPA-test1-20161218')) or (PartitionKey eq 'LOS-test2-20161219')) or (PartitionKey eq 'SPA-test2-20161219')) or (PartitionKey eq 'SPA-test3-20161218')) or (PartitionKey eq 'LOS-test3-20161218')) or (PartitionKey eq 'SPA-test4-20161219')) or (PartitionKey eq 'LOS-test4-20161219')) or (PartitionKey eq 'SPA-test5-20161219')) or (PartitionKey eq 'LOS-test5-20161219')

我只得到了部分预期结果(三分之一)。同时,当我使用 Microsoft Azure Storage Explorer 运行此查询时,我得到了正确的数据。

为什么会发生这种情况?

private string GenerateFilterCondition(string s, string c, DateTime date)
{
        return TableQuery.GenerateFilterCondition(
            "PartitionKey", QueryComparisons.Equal,
            s + "-" + c + "-" + date.ToString("yyyyMMdd"));
}

private List<SiteSpecificDataTableDataSet> GetSiteSpecificDataTableDataSet()
{           
    _connection.Open();
    DateTime selectedDate = DateTime.Now.AddDays(-1);

    TableQuery<DataEntity> tq = new TableQuery<DataEntity>().Where(GenerateFilterCondition("SPA", "test5", selectedDate));
    tq = AddFilterORToTableQuery(tq.FilterString, GenerateFilterCondition("LOS", "test5", selectedDate));
    tq = AddFilterORToTableQuery(tq.FilterString, GenerateFilterCondition("SPA", "test4", selectedDate.AddDays(1)));
    tq = AddFilterORToTableQuery(tq.FilterString, GenerateFilterCondition("LOS", "test4", selectedDate.AddDays(1)));
    tq = AddFilterORToTableQuery(tq.FilterString, GenerateFilterCondition("LOS", "test3", selectedDate));
    tq = AddFilterORToTableQuery(tq.FilterString, GenerateFilterCondition("SPA", "test3", selectedDate));
    tq = AddFilterORToTableQuery(tq.FilterString, GenerateFilterCondition("LOS", "test2", selectedDate.AddDays(1)));
    tq = AddFilterORToTableQuery(tq.FilterString, GenerateFilterCondition("SPA", "test2", selectedDate.AddDays(1)));
    tq = AddFilterORToTableQuery(tq.FilterString, GenerateFilterCondition("LOS", "test1", selectedDate.AddDays(1)));
    tq = AddFilterORToTableQuery(tq.FilterString, GenerateFilterCondition("SPA", "test1", selectedDate.AddDays(1)));

    IEnumerable<DataEntity> entities = _connection.QueryData(tq);
}

并且 QueryData 看起来像:

    IEnumerable<DataEntity> res;
            List<DataEntity> queryResult = new List<DataEntity>();
            CloudTableClient tableClient = _storageAccount.CreateCloudTableClient();
            CloudTable table = tableClient.GetTableReference("data");
            TableContinuationToken tct = null;
            do
            {
                // Retrieve a segment (up to 1,000 entities).
                TableQuerySegment<DataEntity> tableQueryResult = table.ExecuteQuerySegmentedAsync(query, tct).Result;                
                if (tableQueryResult.Results.Count == 0) break;
                tct = tableQueryResult.ContinuationToken;
                foreach (var result in tableQueryResult.Results)
                {
                    queryResult.Add(result);
                }

            } while (tct != null);
            res = queryResult;

最佳答案

代码中的这个条件不正确:“if (tableQueryResult.Results.Count == 0) break”,即使结果为空,您可能仍然需要继续查询。

正确的条件应该是:“if (tableQueryResult.ContinuationToken == null) break”。

顺便说一句,强烈不建议在一个过滤字符串中查询不同的分区键,因为根据 Azure 表设计,它会导致整个表扫描,这在性能上很糟糕。您需要将查询拆分为多个(一次一个分区键)查询以获得更好的性能。

关于c# - 查询azure表服务给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41226729/

相关文章:

c# - 自定义 UserControl - 设计时支持控件重绘

c# - 获取下一个同级节点中相同位置的节点

AzureML : "Train Matchbox Recommender" is not working and does not descibe the error

c# - 如何通过TableServiceEntity将二进制文件保存到Azure表存储?

c# - 检查 block blob 是否存在失败

c# - html helper 接受一个字典<string,object>,如何使用这个参数?

c# - Linq 到 XML : Queries for If blocks C#

c# - 持久保存到 Azure 表存储时使用 POCO

azure - 如何使用 Azure SDK 创建应用程序注册

Azure Bicep 部署 - 找不到路径“C :\Users\<user>\AppData\Local\Temp\<guid>\<template>. json”