2015-10-16 79 views
2

我想使用服務結構可靠字典存儲我們打算通過其餘接口查詢的數據。我想知道在這些集合中查詢數據的最佳方法是什麼。查詢可靠的字典集合的最佳方法是什麼

該文檔似乎沒有提供任何方法來支持查詢IReliableDictionary接口,而不是簡單地枚舉集合。

是唯一選擇從可靠的字典中提取每個對象並彈出列表查詢的集合?

感謝

回答

3

IReliableDictionary實現IEnumerable,這意味着你可以使用LINQ查詢表達式它,你將與一個IDictionary一樣。

請注意,IReliableDictionary上的枚舉使用快照隔離,因此它是無鎖的。基本上這意味着當你開始枚舉時,你正在枚舉字典,因爲它是在你開始的時候。如果在枚舉時添加或刪除項目,則這些更改不會顯示在枚舉中。關於這個和可靠的收藏品一般在這裏的更多信息:https://azure.microsoft.com/en-us/documentation/articles/service-fabric-reliable-services-reliable-collections/

+1

IEnumerable的支持已被刪除看其他問題,並使用IAsyncEnumerable – user1496062

3

正如Vaclav在他的答案中提到的,你可以隨時枚舉整個字典和過濾器,如你所願。此外,請查看IReliableDictionary的文檔,特別是CreateEnumerableAsync(ITransaction, Func<TKey, Boolean>, EnumerationMode)。這使您可以過濾枚舉中希望包含的鍵,這可以提高性能(例如通過避免從磁盤中重新分配不必要的值)。

簡單的例子(異常處理/重試/等不再贅述。):

var myDictionary = await this.StateManager.GetOrAddAsync<IReliableDictionary<int, string>>(new Uri("fabric:/myDictionary")); 

using (var tx = this.StateManager.CreateTransaction()) 
{ 
    // Fetch all key-value pairs where the key an integer less than 10 
    var enumerable = await myDictionary.CreateEnumerableAsync(tx, key => key < 10, EnumerationMode.Ordered); 
    var asyncEnumerator = enumerable.GetAsyncEnumerator(); 

    while (await asyncEnumerator.MoveNextAsync(cancellationToken)) 
    { 
     // Process asyncEnumerator.Current.Key and asyncEnumerator.Current.Value as you wish 
    } 
} 

您可以創建罐裝或對應你的REST查詢動態密鑰濾波器,基於搜索的關鍵 - 基於價值查詢您將需要回退到完全枚舉(例如,通過使用與上面相同的模式,但省略鍵過濾器)或使用通知來構建您自己的二級索引。

+1

添加一些代碼將是有益的。只是有一個鏈接和類名不是非常有用。 – Teepeemm

+0

儘管這個鏈接可能回答這個問題,但最好在這裏包含答案的基本部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – Marusyk

相關問題