Azure service fabric 查询可靠词典集合的最佳方法是什么

Azure service fabric 查询可靠词典集合的最佳方法是什么,azure-service-fabric,Azure Service Fabric,我想使用ServiceFabric可靠字典来存储我们打算通过rest接口查询的数据。我想知道查询这些集合中的数据的最佳方法是什么 除了简单地枚举集合之外,文档似乎没有提供任何方法来支持查询IReliableDictionary接口 是从可靠字典中取出每个对象并弹出列表集合进行查询的唯一选项吗 谢谢IReliableDictionary实现了IEnumerable,这意味着您可以使用LINQ表达式查询它,就像使用IDictionary一样 请注意,IReliableDictionary上的枚举使用

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

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

是从可靠字典中取出每个对象并弹出列表集合进行查询的唯一选项吗


谢谢

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


请注意,IReliableDictionary上的枚举使用快照隔离,因此它是无锁的。基本上,这意味着当您开始枚举时,您正在字典上进行枚举,就像您开始时一样。如果在枚举时添加或删除项,则这些更改不会显示在该枚举中。这里有更多关于这个和可靠的集合的信息:

正如瓦茨拉夫在他的回答中提到的,你可以随时列举整个字典,并根据你的意愿进行筛选。此外,请查看文档,特别是
CreateEnumerableAsync(ITransaction、Func、EnumerationMode)
。这允许您预先筛选要包含在枚举中的键,这可能会提高性能(例如,通过避免从磁盘返回不必要的值)

简单示例(为简洁起见,省略了异常处理/重试等):

var myDictionary=wait this.StateManager.GetOrAddAsync(新Uri(“结构:/myDictionary”);
使用(var tx=this.StateManager.CreateTransaction())
{
//获取键为小于10的整数的所有键值对
var enumerable=wait myDictionary.CreateEnumerableAsync(tx,key=>key<10,EnumerationMode.Ordered);
var asyncEnumerator=enumerable.GetAsyncEnumerator();
while(等待asyncEnumerator.MoveNextAsync(cancellationToken))
{
//根据需要处理asyncEnumerator.Current.Key和asyncEnumerator.Current.Value
}
}
您可以创建与REST查询相对应的固定或动态键筛选器,这些查询基于键进行搜索。对于基于值的查询,您需要返回到完全枚举(例如,通过使用与上面相同的模式,但省略键筛选器)或使用通知来构建您自己的二级索引

看这里

有两种方法可以做到这一点

  • 这提供了一个 桥接到Ix异步以及Select的异步实现, 选择many和Where
  • 您可以简单地包装异步

  • 此答案:显示如何将SerivReferc的
    IAsyncEnumerable
    转换为泛型
    IAsyncEnumerable
    。然后您可以使用dotnet提供的异步Linq。

    添加一些代码会很有帮助。仅仅有一个链接和类名并不是很有用。虽然这个链接可以回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,则仅链接的答案可能会无效。GetAsyncEnumerator是否会在通过枚举移动NextAsync()时获取在该时间返回的所有键/值?我正试图从我的字典中只获取第一个键,不知道这样做,然后只调用MoveNextAsync()一次,是否会导致只提取第一个键/值对,还是整个集合都被提取?IEnumerable支持已被删除请参阅其他问题并使用IAsyncEnumerable
    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
        }
    }