Можно ли запросить PartitionKey с помощью StartsWith?
В хранилище таблиц Azure можно запросить PartitionKey с помощью StartsWith или другого оператора, например, Contains и т. Д.
Я знаю, что могу сделать это с помощью RowKeys, но возможно ли это сделать с помощью PartitionKeys?
Последующий вопрос: даже если это выполнимо, это целесообразно? Должен ли PartitionKey всегда быть точным совпадением - скажем, по причинам производительности?
3 ответа
Что ж, хорошая новость заключается в том, что вы МОЖЕТЕ выполнять частичные совпадения, и вы получите "хорошую" производительность, если число удаляемых разделов невелико. Если у вас много разделов, производительность пострадает.
Я мог бы попытаться обобщить отличную статью об этом, но она уже написана, поэтому, если вы укажете браузеру на следующую ссылку, вы должны узнать все, что нужно знать о разделах, ключах строк и ожидаемых результатах:
https://msdn.microsoft.com/en-us/library/azure/hh508997.aspx
Вот пример использования GreaterThanOrEqual
а также LessThan
операторы, как расширение имени целевого столбца.
Фильтр объединяет две части:
- все, что больше или равно вашему старту с префиксом,
- увеличьте последний символ вашего префикса и найдите что-нибудь меньшее, чем это.
Например, 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;
}
Использование:
var query = new TableQuery<MyTableEntity>().Where(myColumnName.GetStartsWithFilter(prefix));
На основе сообщения в блоге Александра B
В хранилище таблиц Azure можно запросить PartitionKey с помощью StartsWith или другого оператора, например, Contains и т. Д.
Нет, невозможно выполнять запросы с использованием StartsWith или оператора запросов Contains с таблицами Azure. Симулировать StartsWith
, вам нужно будет использовать комбинацию Greater Than Equal To
а также Less 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/.