2016-03-04 7 views
4

В Azure Table Storage можно запросить PartitionKey с помощью StartsWith или какого-либо другого оператора, например. Содержит и т. Д.Может ли PartitionKey запрашиваться с помощью StartsWith?

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

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

ответ

-1

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

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

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

+1

Этот ответ неверен! Вы не можете выполнять частичный поиск с помощью таблиц Azure с помощью таких операторов, как StartsWith или Contains. –

+0

Мы предпочитаем ответы здесь без голосования, пожалуйста, сообщения лучше всего привлекают +/- голосов органично. Благодаря! – halfer

2

в Azure Table Storage, можно запросить PartitionKey с StartsWith или какой-либо другой оператор, например, Содержит и т. Д.

Нет, это невозможно сделать с помощью StartsWith или Содержит запрос оператора с таблицами 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/.

7

Ниже приведен пример использования операторов 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)); 

основе Alexandre B's blog post