我想使用服務結構可靠字典存儲我們打算通過其餘接口查詢的數據。我想知道在這些集合中查詢數據的最佳方法是什麼。查詢可靠的字典集合的最佳方法是什麼
該文檔似乎沒有提供任何方法來支持查詢IReliableDictionary
接口,而不是簡單地枚舉集合。
是唯一選擇從可靠的字典中提取每個對象並彈出列表查詢的集合?
感謝
我想使用服務結構可靠字典存儲我們打算通過其餘接口查詢的數據。我想知道在這些集合中查詢數據的最佳方法是什麼。查詢可靠的字典集合的最佳方法是什麼
該文檔似乎沒有提供任何方法來支持查詢IReliableDictionary
接口,而不是簡單地枚舉集合。
是唯一選擇從可靠的字典中提取每個對象並彈出列表查詢的集合?
感謝
IReliableDictionary實現IEnumerable,這意味着你可以使用LINQ查詢表達式它,你將與一個IDictionary一樣。
請注意,IReliableDictionary上的枚舉使用快照隔離,因此它是無鎖的。基本上這意味着當你開始枚舉時,你正在枚舉字典,因爲它是在你開始的時候。如果在枚舉時添加或刪除項目,則這些更改不會顯示在枚舉中。關於這個和可靠的收藏品一般在這裏的更多信息:https://azure.microsoft.com/en-us/documentation/articles/service-fabric-reliable-services-reliable-collections/
正如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查詢動態密鑰濾波器,基於搜索的關鍵 - 基於價值查詢您將需要回退到完全枚舉(例如,通過使用與上面相同的模式,但省略鍵過濾器)或使用通知來構建您自己的二級索引。
看吧What would be the best way to search an IReliableDictionary?
在兩個辦法做到這一點
IEnumerable的支持已被刪除看其他問題,並使用IAsyncEnumerable – user1496062