问题:没有返回任何结果。
我正在使用以下代码从一个只有100行左右的分区中获取一系列对象:
var rangeQuery = new TableQuery<StorageEntity>().Where(
TableQuery.CombineFilters(
TableQuery.CombineFilters(
TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey),
TableOperators.And,
TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.GreaterThanOrEqual, from)
),
TableOperators.And,
TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.LessThanOrEqual, to)
)
);
var results = table.ExecuteQuery(rangeQuery);
foreach (StorageEntity entity in results)
{
storageEntities.Add(entity);
}
注意:我如何组合3个术语并不重要,不会返回任何结果。我期待的一个例子就是this(partitionKey,rowKey):
“10005678”,“PL7NR_201503170900”
远程过滤器代码生成以下表达式:
((PartitionKey eq'10005678')和(RowKey ge'PL7NR_201503150000')) 和(RowKey lt'PL7NR_201504082359')
但我也尝试了这个(出于性能原因,这是我首选的方法,即分区扫描):
(PartitionKey eq'10005678')和((RowKey ge'PL7NR_201503150000')和 (RowKey lt'PL7NR_201504082359'))
我的理解是表存储执行词法搜索,因此这些行键应该包含一个包含具有以下键的行的范围:
“10005678”,“PL7NR_201503170900”
我的理解是否存在根本性的错误?
感谢您查看此内容。
更新:感谢Gaurav的回答更新了问题。上面的代码隐式处理延续令牌(即foreach循环),并且分区中只有100个左右的项目,因此我不认为延续令牌是一个问题。
我尝试从密钥中删除下划线('_'),甚至尝试从rowKey移动前缀并将其作为后缀添加到partitionKey。
注意:这都是使用存储模拟在我的本地计算机上运行的。
答案 0 :(得分:2)
来自Query Timeout and Pagination
:
针对Table服务的查询最多可返回1,000个项目 一次可执行最多五秒钟。如果 如果查询没有,结果集包含1,000多个项目 在五秒内完成,或者如果查询穿过分区 边界,响应包括提供开发人员的标题 使用延续令牌来恢复查询 结果集中的下一个项目。延续令牌标题可能是 返回查询表操作或查询实体操作。
请检查您是否回复Continuation Token
作为回应。
现在进入过滤器表达式:
((PartitionKey eq&#39; 10005678&#39;)和(RowKey ge&#39; PL7NR_201503150000&#39;)) 和(RowKey lt&#39; PL7NR_201504082359&#39;)
这个肯定是 Full Table Scan
,因为(RowKey lt 'PL7NR_201504082359')
本身就是一个条款。为了执行这个特定的部分,它基本上从表的顶部开始,找出RowKey < 'PL7NR_201504082359'
的实体,而不考虑PartitionKey。
(PartitionKey eq&#39; 10005678&#39;)和((RowKey ge&#39; PL7NR_201503150000&#39;)和 (RowKey lt&#39; PL7NR_201504082359&#39;))
这个正在执行 Partition Scan
,如果您在指定的分区中有太多数据,或者查询执行时间超过5秒,您可能无法获得结果,如上所述
因此,检查您的查询是否返回任何延续令牌,如果没有返回任何实体,请使用它们来获取下一组实体。
您可能会发现一些有用的资源: