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 To
和 Less 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/。
下面是一个使用 GreaterThanOrEqual
和 LessThan
运算符作为目标列名称扩展的示例。
过滤器由两部分组成:
- 大于或等于您的 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));
在 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 To
和 Less 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/。
下面是一个使用 GreaterThanOrEqual
和 LessThan
运算符作为目标列名称扩展的示例。
过滤器由两部分组成:
- 大于或等于您的 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));