PartitionKey可以用StartsWith查询吗?

Can PartitionKey be queried with StartsWith?

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

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

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

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

我可以试着总结一篇关于这个的优秀文章,但它已经写好了,所以如果你将浏览器指向以下 link,你应该了解所有关于分区、行键的知识,以及预期的表现:

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

In Azure Table Storage, is it possible to query PartitionKey with a StartsWith or some other operator e.g. Contains, etc.

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

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

I know I can do this with RowKeys but is it possible to do it with PartitionKeys?

我认为这是不可能的。我很好奇你为什么这么说。

A follow up question is: even if it's doable, is it advisable? Should PartitionKey always be an exact match -- say, for performance reasons?

我强烈推荐阅读这本优秀的指南:https://azure.microsoft.com/en-in/documentation/articles/storage-table-design-guide/

下面是一个使用 GreaterThanOrEqualLessThan 运算符作为目标列名称扩展的示例。

过滤器由两部分组成:

  • 大于或等于您的 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's blog post