我想使用服务结构可靠的字典来存储我们打算通过休息接口查询的数据。我想知道查询这些集合中的数据的最佳方法是什么。
除了简单地枚举集合之外,文档似乎没有提供任何支持查询IReliableDictionary
接口的方法。
是从可靠字典中获取每个对象并弹出到List<>中的唯一选项。查询集合?
由于
答案 0 :(得分:4)
正如瓦茨拉夫在他的回答中提到的那样,你可以随时列举整个字典并按你的意愿过滤。另外,请查看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 :(得分:3)
IReliableDictionary实现IEnumerable,这意味着您可以使用LINQ表达式查询它,就像使用IDictionary一样。
请注意,IReliableDictionary上的枚举使用快照隔离,因此它是无锁的。基本上,这意味着当您开始枚举时,您将在字典中枚举,就像您在开始时一样。如果在您枚举时添加或删除了项目,则这些更改不会出现在该枚举中。有关此和可靠收藏的更多信息,请访问:API Guide
答案 2 :(得分:0)
看这里What would be the best way to search an IReliableDictionary?
有两种方法可以做到这一点
答案 3 :(得分:0)
此答案:Convert IReliableDictionary to IList显示了如何将SerivceFabric的IAsyncEnumerable
转换为通用IAsyncEnumerable
。然后,您可以使用dotnet提供的Async Linq。