15

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

我知道我可以使用 RowKeys 来做到这一点,但是否可以使用 PartitionKeys 来做到这一点?

一个后续问题是:即使可行,是否可取?PartitionKey 是否应该始终完全匹配——比如说,出于性能原因?

4

3 回答 3

26

这是一个使用GreaterThanOrEqualandLessThan运算符的示例,作为目标列名称的扩展。

过滤器结合了两个部分:

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

例如,startsWith前缀“CAR”将准备类似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;
    }

用法:

var query = new TableQuery<MyTableEntity>().Where(myColumnName.GetStartsWithFilter(prefix));

基于Alexandre B 的博文

于 2017-01-11T08:54:58.540 回答
2

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

不可以,不能对 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/ 。

于 2016-03-05T08:29:02.870 回答
-3

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

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

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

于 2016-03-05T05:50:46.557 回答