Можно ли запросить PartitionKey с помощью StartsWith?

В хранилище таблиц Azure можно запросить PartitionKey с помощью StartsWith или какого-либо другого оператора, например. Содержит и др.

Я знаю, что могу сделать это с помощью RowKeys, но возможно ли это сделать с помощью PartitionKeys?

Последующий вопрос: даже если это выполнимо, целесообразно ли это? Должен ли PartitionKey всегда быть точным совпадением, скажем, из соображений производительности?


person Sam    schedule 04.03.2016    source источник


Ответы (3)


Что ж, хорошая новость заключается в том, что вы МОЖЕТЕ выполнять частичные совпадения, и вы получите «хорошую» производительность, пока количество пораженных разделов невелико. Если у вас много ключей разделов, производительность пострадает.

Я мог бы попытаться резюмировать отличную статью об этом, но она уже написана, поэтому, если вы укажете в своем браузере следующую ссылку, вы должны узнать все, что нужно знать о разделах, ключах строк и ожидаемых характеристиках:

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

person Pedro G. Dias    schedule 05.03.2016
comment
Этот ответ неверный! Вы не можете выполнять частичный поиск в таблицах Azure с помощью таких операторов, как StartsWith или Contains. - person Gaurav Mantri; 05.03.2016
comment
Мы предпочитаем ответы здесь без запросов на голосование, пожалуйста - сообщения лучше всего привлекают +/- голосов органически. Спасибо! - person halfer; 06.06.2016

Вот пример использования операторов GreaterThanOrEqual и LessThan в качестве расширения имени целевого столбца.

Фильтр объединяет две части:

  • все, что больше или равно вашему префиксу startWith,
  • увеличьте последний символ вашего префикса и найдите что-нибудь меньшее, чем это.

Например, префикс 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));

На основе Александра Б. сообщение в блоге

person richaux    schedule 11.01.2017

В хранилище таблиц Azure можно запросить PartitionKey с помощью StartsWith или какого-либо другого оператора, например. Содержит и др.

Нет, невозможно выполнять запросы с помощью операторов запросов 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/.

person Gaurav Mantri    schedule 05.03.2016