Можно ли запросить 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/.

Другие вопросы по тегам