可以使用StartsWith查询PartitionKey吗?

时间:2016-03-04 19:25:23

标签: azure azure-table-storage azure-tablequery

在Azure表存储中,是否可以使用StartsWith或其他一些运算符来查询PartitionKey,例如包含等等。

我知道我可以使用RowKeys执行此操作,但是可以使用PartitionKeys吗?

后续问题是:即使它可行,是否可取? PartitionKey应该是完全匹配 - 比如,出于性能原因吗?

3 个答案:

答案 0 :(得分:16)

以下是使用docker-machine ip default GreaterThanOrEqual运算符作为目标列名称的扩展名的示例。

过滤器结合了两个部分:

  • 任何大于或等于您的startsWith前缀的内容,
  • 增加前缀的最后一个字符,找到小于此的任何内容。

例如,LessThan前缀" CAR"将准备类似startsWith的内容。

s >= "CAR" && s < "CAS"

用法:

    public static string GetStartsWithFilter(this string columnName, string startsWith)
    {
        var length = startsWith.Length - 1;
        var nextChar = startsWith[length] + 1;

        var startWithEnd = startsWith.Substring(0, length) + (char)nextChar;
        var filter = TableQuery.CombineFilters(
            TableQuery.GenerateFilterCondition(columnName, QueryComparisons.GreaterThanOrEqual, startsWith),
            TableOperators.And,
            TableQuery.GenerateFilterCondition(columnName, QueryComparisons.LessThan, startWithEnd));

        return filter;
    }

基于Alexandre B's blog post

答案 1 :(得分:4)

  

在Azure表存储中,是否可以使用a查询PartitionKey   StartsWith或其他一些运算符,例如包含等等。

不可以使用Azure表格使用StartsWith或Contains查询运算符进行查询。要模拟StartsWith,您需要使用Greater Than Equal ToLess Than运算符的组合。您无法使用Contains运营商。您需要做的是首先获取客户端上的所有数据,然后使用Contains仅过滤客户端上的数据。

有关支持的查询运算符列表,请参阅以下链接:https://msdn.microsoft.com/en-us/library/azure/dd135725.aspx

  

我知道我可以用RowKeys做到这一点,但有可能做到这一点   PartitionKeys?

我认为这是不可能的。我很想知道你为什么这么说。

  

后续问题是:即使它可行,是否可取?应该   PartitionKey总是完全匹配 - 比如,出于性能原因?

我强烈建议您阅读以下优秀指南:https://azure.microsoft.com/en-in/documentation/articles/storage-table-design-guide/

答案 2 :(得分:-3)

好吧,好消息是你可以进行部分匹配,只要被击中的分区数量很少,你就会获得“好”的表现。如果您有许多分区键,性能将受到影响。

我可以尝试总结一篇关于此的优秀文章,但它已经写好了,所以如果你将浏览器指向以下链接,你应该学习所有关于分区,rowkeys和预期性能的知识:< / p>

https://msdn.microsoft.com/en-us/library/azure/hh508997.aspx