【发布时间】:2016-01-15 10:09:07
【问题描述】:
我想使用服务结构可靠字典来存储我们打算通过休息接口查询的数据。我想知道查询这些集合中保存的数据的最佳方法是什么。
除了简单地枚举集合之外,文档似乎没有提供任何方法来支持查询IReliableDictionary 接口。
是从可靠字典中取出每个对象并弹出到 List 集合中进行查询的唯一选择吗?
谢谢
【问题讨论】:
我想使用服务结构可靠字典来存储我们打算通过休息接口查询的数据。我想知道查询这些集合中保存的数据的最佳方法是什么。
除了简单地枚举集合之外,文档似乎没有提供任何方法来支持查询IReliableDictionary 接口。
是从可靠字典中取出每个对象并弹出到 List 集合中进行查询的唯一选择吗?
谢谢
【问题讨论】:
正如 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 查询相对应的罐装或动态键过滤器,这些查询基于键进行搜索 - 对于基于值的查询,您需要回退到完全枚举(例如,使用与上述相同的模式,但省略键过滤器)或使用通知来构建您自己的二级索引。
【讨论】:
IReliableDictionary 实现了 IEnumerable,这意味着您可以使用 LINQ 表达式查询它,就像使用 IDictionary 一样。
请注意,对 IReliableDictionary 的枚举使用快照隔离,因此它是无锁的。基本上,这意味着当您开始枚举时,您正在枚举字典,就像您开始时一样。如果在您枚举时添加或删除项目,这些更改将不会出现在该枚举中。有关此内容和 Reliable Collections 的更多信息,请点击此处:https://azure.microsoft.com/en-us/documentation/articles/service-fabric-reliable-services-reliable-collections/
【讨论】:
看这里What would be the best way to search an IReliableDictionary?
有两种方法可以做到这一点
【讨论】:
这个答案:Convert IReliableDictionary to IList 展示了如何将 SerivceFabric 的 IAsyncEnumerable 转换为通用的 IAsyncEnumerable。然后就可以使用dotnet提供的Async Linq了。
【讨论】: