2015-10-16 80 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

相关问题