我想使用服务结构可靠字典存储我们打算通过其余接口查询的数据。我想知道在这些集合中查询数据的最佳方法是什么。查询可靠的字典集合的最佳方法是什么
该文档似乎没有提供任何方法来支持查询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