4

我想使用服务结构可靠字典来存储我们打算通过休息接口查询的数据。我想知道查询这些集合中保存的数据的最佳方法是什么。

IReliableDictionary除了简单地枚举集合之外,该文档似乎没有提供任何方法来支持查询接口。

是从可靠字典中获取每个对象并弹出到 List<> 集合中进行查询的唯一选择吗?

谢谢

4

4 回答 4

4

正如 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 查询相对应的罐装或动态键过滤器 - 对于基于值的查询,您将需要回退到完整枚举(例如,通过使用与上述相同的模式,但省略键过滤器)或使用通知来构建您自己的二级索引。

于 2015-11-21T00:20:08.343 回答
3

IReliableDictionary 实现了 IEnumerable,这意味着您可以使用 LINQ 表达式查询它,就像使用 IDictionary 一样。

请注意,对 IReliableDictionary 的枚举使用快照隔离,因此它是无锁的。基本上,这意味着当您开始枚举时,您正在枚举字典,就像您开始时一样。如果在您枚举时添加或删除项目,这些更改将不会出现在该枚举中。有关此内容和 Reliable Collections 的更多信息,请点击此处:https ://azure.microsoft.com/en-us/documentation/articles/service-fabric-reliable-services-reliable-collections/

于 2015-10-16T19:34:18.720 回答
0

这个答案:将 IReliableDictionary 转换为 IList展示了如何将 SerivceFabric 转换IAsyncEnumerable为通用的IAsyncEnumerable. 然后就可以使用 dotnet 提供的 Async Linq。

于 2020-05-17T07:38:52.483 回答
0

看这里搜索 IReliableDictionary 的最佳方法是什么?

有两种方法可以做到

  1. Eli Arbel 在 Gist 上有异步扩展方法,它们为 Ix-Async 以及 Select、SelectMany 和 Where 的异步实现提供了桥梁。
  2. 您可以将 IAsyncEnumerable 包装在简单地包装异步的常规 IEnumerable 中
于 2017-01-04T13:17:47.250 回答