我希望使用Service Fabric可靠字典来存储我们打算通过REST接口查询的数据。我想知道查询这些集合中保存的数据的最佳方法是什么。
文档似乎没有提供除枚举集合外支持查询IReliableDictionary接口的任何方法。
难道唯一的选择是从可靠字典中获取每个对象并弹出到List<>集合以进行查询吗?
谢谢
文档似乎没有提供除枚举集合外支持查询IReliableDictionary接口的任何方法。
难道唯一的选择是从可靠字典中获取每个对象并弹出到List<>集合以进行查询吗?
谢谢
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/
看这里 什么是搜索 IReliableDictionary 的最佳方法?
有两种方法可以做到
这个答案:将 IReliableDictionary 转换为 IList 展示了如何将 ServiceFabric 的 IAsyncEnumerable
转换为通用的 IAsyncEnumerable
。然后你就可以使用 dotnet 提供的异步 Linq。