C# 查询azure表服务会得到不同的结果

C# 查询azure表服务会得到不同的结果,c#,azure,azure-storage,C#,Azure,Azure Storage,我正在尝试使用Microsoft azure storage SDK查询azure表存储。发送简单请求将返回预期结果(类似于)。但当我发送一个更复杂的查询时,比如: (((((((((PartitionKey eq 'LOS-test1-20161218') or (PartitionKey eq 'SPA-test1-20161218')) or (PartitionKey eq 'LOS-test2-20161219')) or (PartitionKey eq 'SPA-test2-2

我正在尝试使用Microsoft azure storage SDK查询azure表存储。发送简单请求将返回预期结果(类似于)。但当我发送一个更复杂的查询时,比如:

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

代码中的此条件不正确:“如果(tableQueryResult.Results.Count==0)中断”,则即使结果为空,也可能需要继续查询

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


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

代码中的此条件不正确:“如果(tableQueryResult.Results.Count==0)中断”,即使结果为空,您也可能需要继续查询

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


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

如何运行它,显示一些代码?您在第一个代码块中编写的查询与您通过代码生成的查询不同。请检查两个地方是否使用了相同的查询?是的,我确信它们是正确的,我从调试器复制了值。后来我在玩代码,所以日期可能有点不同。它们正常。“如果(tableQueryResult.Results.Count==0)中断”此条件不正确,即使结果为空,您可能仍需要继续查询。正确的条件应该是:“if(tableQueryResult.ContinuationToken==null)break”顺便说一句,强烈建议不要在一个筛选器字符串中查询不同的分区键,因为根据Azure表设计,这将导致整个表扫描,这在性能上非常糟糕。您需要将查询拆分为多个(一次一个分区键)查询以获得更好的性能。如何运行它,显示一些代码?您在第一个代码块中编写的查询与您通过代码生成的查询不同。请检查两个地方是否使用了相同的查询?是的,我确信它们是正确的,我从调试器复制了值。后来我在玩代码,所以日期可能有点不同。它们正常。“如果(tableQueryResult.Results.Count==0)中断”此条件不正确,即使结果为空,您可能仍需要继续查询。正确的条件应该是:“if(tableQueryResult.ContinuationToken==null)break”顺便说一句,强烈建议不要在一个筛选器字符串中查询不同的分区键,因为根据Azure表设计,这将导致整个表扫描,这在性能上非常糟糕。您需要将查询拆分为多个(一次一个分区键)查询以获得更好的性能。
    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;