2016-03-04 87 views
4

在Azure表存儲中,是否可以使用StartsWith或其他某個操作符(例如,包含等可以用StartsWith查詢PartitionKey嗎?

我知道我可以用RowKeys做到這一點,但是可以用PartitionKeys做到嗎?

後續問題是:即使可行,是否明智? PartitionKey應該總是完全匹配 - 例如,出於性能原因?

回答

-1

好吧,好消息是你可以做部分匹配,只要被擊中的分區數很少,你就會獲得「好」的表現。如果你有很多分區鍵,性能會受到影響。

我可以嘗試總結一下,但它已經寫好了,所以如果你把瀏覽器指向下面的鏈接,你應該知道關於分區,行鍵和預期表現的所有信息:

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

+1

這個答案是不正確!使用諸如StartsWith或Contains之類的運算符不能使用Azure Tables進行部分搜索。 –

+0

我們更喜歡這裏沒有投票請求的答案 - 帖子最好是有機地吸引+/-投票。謝謝! – halfer

2

在天青表寄存,是有可能與 StartsWith或一些其它操作者例如查詢PartitionKey包含等

不,不可以使用StartsWith或Contains查詢運算符與Azure表執行查詢。要模擬StartsWith,您需要使用Greater Than Equal ToLess 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

下面是使用GreaterThanOrEqualLessThan運算符作爲目標列名稱的擴展的示例。

過濾器結合了兩個部分:

  • 任何大於或等於您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