简体   繁体   English

查询Azure Table服务给出不同的结果

[英]Querying azure table service gives diffrent results

I am trying to query azure table storage with Microsoft Azure Storage SDK. 我正在尝试使用Microsoft Azure存储SDK查询Azure表存储。 Sending simple request returns expected results (similar to https://docs.microsoft.com/en-us/azure/storage/storage-dotnet-how-to-use-tables#retrieve-a-range-of-entities-in-a-partition ). 发送简单请求将返回预期结果(类似于https://docs.microsoft.com/zh-cn/azure/storage/storage-dotnet-how-to-use-tables#retrieve-a-range-of-entities-in -a-partition )。 But when I send a more complex query like this one: 但是,当我发送这样一个更复杂的查询时:

  (((((((((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')

I get only part of expected results (one third). 我只得到预期结果的一部分(三分之一)。 Meanwhile when I run this query with Microsoft Azure Storage Explorer I get correct data. 同时,当我使用Microsoft Azure Storage Explorer运行此查询时,我会获得正确的数据。

Why does it happen? 为什么会发生?

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);
}

And QueryData looks like: 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;

This condition in your code is incorrect: "if (tableQueryResult.Results.Count == 0) break", you may still need to continue querying even when the result is empty. 您的代码中的此条件不正确:“如果(tableQueryResult.Results.Count == 0)中断”,即使结果为空,您仍可能需要继续查询。

The correct condition should be: "if (tableQueryResult.ContinuationToken == null) break". 正确的条件应该是:“如果(tableQueryResult.ContinuationToken == null)中断”。

BTW, querying different Partition Keys in one filter string is highly not recommended since per Azure Table design it'll result in whole table scan which is terrible in performance. 顺便说一句,强烈建议不要在一个过滤器字符串中查询不同的分区键,因为按照Azure表的设计,这将导致整个表扫描,这在性能上很糟糕。 You need to split your query into multiple (one Partition Key at a time) queries to achieve better performance. 您需要将查询拆分为多个(一次一个分区键)查询,以获得更好的性能。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM