什么是查询可靠字典集合的最佳方法?

5
我希望使用Service Fabric可靠字典来存储我们打算通过REST接口查询的数据。我想知道查询这些集合中保存的数据的最佳方法是什么。
文档似乎没有提供除枚举集合外支持查询IReliableDictionary接口的任何方法。
难道唯一的选择是从可靠字典中获取每个对象并弹出到List<>集合以进行查询吗?
谢谢
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查询对应的预定义或动态密钥过滤器,这些过滤器基于键进行搜索。对于基于值的查询,您将需要退回到完整枚举(例如使用上述相同模式但省略键过滤器)或使用通知来构建自己的次要索引。


1
添加一些代码会很有帮助。仅仅有链接和类名并不是非常有用。 - Teepeemm
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。仅有链接的答案如果链接页面发生更改可能会变得无效。 - Roman Marusyk
GetAsyncEnumerator会在调用MoveNextAsync()时获取每个键/值对,还是在那个时间点返回的所有键/值对都被获取了?我正在尝试从我的字典中获取第一个键,想知道这样做然后只调用一次MoveNextAsync()是否只会拉取第一个键/值对,还是整个集合都会被拉取? - Josh

3

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

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


3
IEnumerable支持已被移除,请参考其他问题并使用IAsyncEnumerable。 - user1496062

0

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接