在RowKey值范围上使用Azure表的词法筛选

在RowKey值范围上使用Azure表的词法筛选,azure,azure-storage,Azure,Azure Storage,问题:没有返回结果 我使用以下代码从只有100行左右的分区中获取一系列对象: var rangeQuery = new TableQuery<StorageEntity>().Where( TableQuery.CombineFilters( TableQuery.CombineFilters( TableQuery.GenerateFilterCondition(

问题:没有返回结果

我使用以下代码从只有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);
            }
var rangeQuery=new TableQuery()。其中(
TableQuery.CombineFilters(
TableQuery.CombineFilters(
TableQuery.GenerateFilterCondition(“PartitionKey”,QueryComparisons.Equal,PartitionKey),
表3.以及,
TableQuery.GenerateFilterCondition(“行键”,QueryComparisons.GreaterThanOrEqual,from)
),
表3.以及,
TableQuery.GenerateFilterCondition(“RowKey”,QueryComparisons.lessthanRequal,to)
)
);
var结果=table.ExecuteQuery(rangeQuery);
foreach(结果中的StorageEntity)
{
添加(实体);
}
注意:我如何组合这3个术语似乎无关紧要,不会返回任何结果。我期望的一个例子是(partitionKey,rowKey):

“10005678”,“PL7NR_201503170900”

范围筛选器代码生成以下表达式:

((分区键eq'10005678')和(RowKey ge'PL7NR_201503150000')) 和(RowKey lt'PL7NR_201504082359')

但我也尝试过这种方法(出于性能原因,这是我的首选方法,即分区扫描):

(分区键eq'10005678')和((RowKey ge'PL7NR_201503150000)以及 (RowKey lt'PL7NR_201504082359'))

我的理解是,表存储执行词法搜索,因此这些行键应包含一个范围,该范围包括具有以下键的行:

“10005678”,“PL7NR_201503170900”

我的理解有什么根本性的错误吗

谢谢你看这个

更新:由于Gaurav的回答,问题更新。上面的代码隐式地处理延续令牌(即foreach循环),分区中只有100个左右的项,因此我不认为延续令牌是一个问题

我已经尝试过从键中删除下划线(“”),甚至尝试过从rowKey中移动前缀并将其作为后缀添加到partitionKey中

注意:这都是在我的本地计算机上使用存储模拟运行的

发件人:

对表服务的查询最多可返回1000项 一次,最多可执行五秒钟。如果 如果查询未包含,则结果集包含1000多个项 在五秒钟内完成,或者如果查询跨越分区 边界,响应包括提供给开发人员的头 使用继续标记,以便在 结果集中的下一项。连续令牌头可以是 为查询表操作或查询实体操作返回

请检查您是否正在回复
延续令牌

现在来看看你的过滤表达式:

((分区键eq'10005678')和(RowKey ge'PL7NR_201503150000')) 和(RowKey lt'PL7NR_201504082359')

这一个肯定是在进行
全表扫描
,因为
(RowKey lt'PL7NR_201504082359')
本身就是一个子句。为了执行这个特定的部分,它基本上从表的顶部开始,并找出实体,其中
RowKey<'PL7NR_201504082359'
,而不考虑分区键

(分区键eq'10005678')和((RowKey ge'PL7NR_201503150000)以及 (RowKey lt'PL7NR_201504082359'))

这一个正在执行分区扫描,如果指定分区中的数据太多,或者如上所述执行查询需要5秒钟以上,则可能无法返回结果

因此,检查您的查询是否返回任何延续标记,如果没有返回任何实体,则使用它们获取下一组实体

您可能会发现一些有用的资源:

  • 如何充分利用Windows Azure表
  • Azure存储表设计指南:设计可扩展和高性能的表:

你好,高拉夫,谢谢你的详细回答。我已经用我的回答更新了这个问题。简言之:我更喜欢分区扫描方法(只是尝试另一种方法看看是否有效),这些链接是我用来达到这一点的一些资源,我在分区中只有100项。干杯:)我刚意识到我最初没有粘贴foreach循环,对此表示抱歉。当您仅使用PartitionKey-
(PartitionKey eq'10005678')
进行查询时会发生什么?你有没有收到任何数据?另外,是否可以将一些示例数据上传到某个地方?您知道,我刚刚找到了服务器资源管理器数据视图(直到现在为止我一直在盲目地摸索!),并且使用它的查询生成器,我已经证明了过滤器是有效的。回过头来看,我意识到我过早地停止了查询处理(即,在循环实际正确填充results对象之前)。这个没有下划线的过滤器的版本实际上是有效的!我现在要用下划线在一边进行测试。我会让你知道我发现了什么,如果你在答案中添加了任何见解,我会选择正确的答案。干杯。好的,看起来这一切都是因为我在进入foreach循环体之前停止了处理。深夜喝太多咖啡得1分。谢谢你的帮助,高拉夫。如果您想为这个“问题”添加一个理智检查,那么我很乐意选择您的答案。