使用.NET SDK v.4从CosmosDB数据库获取动态对象的列表

问题描述

我正在尝试查询一个数据库,其中存储的实体具有不同的属性,并且我想通过不同形状的查询(这就是使用无模式数据库的要点)从此信息中检索某些字段,但是我没有运气CosmosDB。

由于我没有每种查询结果的类(我也不想要),因此我想将它们作为动态列表获取,但我不知道如何检索它们。我尝试过:

mycookies = {'RoliVerification': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ2ZXJzaW9uIjoxLCJwbGF5ZXJfZGF0YSI6eyJuYW1lIjoiNzZfNzciLCJpZCI6MTUxMjExNDM0fSwiaWF0IjoxNTk4MTcwMjE5LCJleHAiOjE2MDU5NDYyNzl9.Wd5wKOdjQqwHUxYPDJtacw_JYzu4cRpel6V4Q0MCrkc','ROBLOSecurity': '_|WARNING:-DO-NOT-SHARE-THIS.--Sharing-this-will-allow-someone-to-log-in-as-you-and-to-steal-your-ROBUX-and-items.|_CD34AEC12CDF5DD8D40320A1C94FEAC6E9E706D42B0B6FC7BFF1D2452239B38206E3'}
b = requests.post("https://www.rolimons.com/Tradeapi/create",cookies=mycookies)
print(b.json())

但是我得到的项目是System.Text.Json.JsonDocument类型的,因此无法按预期工作;

如果我尝试使用ExpandoObjects,则无法使用新的新System.Text.Json序列化器反序列化结果,因为到目前为止,它不支持反序列化到ExpandoObjects:

var queryResultSetIterator = container.GetItemQueryIterator<dynamic>(queryDeFinition,null,new QueryRequestOptions() { PartitionKey = new PartitionKey(idParticion),MaxItemCount = -1 });

List<dynamic> results = new List<dynamic>();

await foreach (dynamic item in queryResultSetIterator)
{
    results.Add(item);
}

目前唯一可行的方法是使用旧的Newtonsoft Json序列化程序,但在我看来,在应用程序中同时存在这两个库似乎是一个过大的杀伤力。

关于如何从CosmosDB获取动态投影的其他想法?

谢谢!

解决方法

更新

我发现我们可以通过以下代码获得结果。

enter image description here

我们可以从动态视图中查看result[0]的详细信息。因此,我尝试找到将动态视图转换为对象的方法。建议我使用反射来解决它。

您可以使用关键字dynamic view as object c#在Google上进行搜索。

private static async Task QueryItemsAsync(CosmosClient cosmosClient)
{
    var sqlQueryText = "select *from c";//"SELECT{ 'name': f.name,'description': f.description,'startDateUtc': f.startDateUtc,'categories': f.categories} MyJasonResult FROM c f";

    CosmosContainer container = cosmosClient.GetContainer(Program.DatabaseId,Program.ContainerId);

    QueryDefinition queryDefinition = new QueryDefinition(sqlQueryText);

    List<dynamic> result = new List<dynamic>();
    await foreach (dynamic item in container.GetItemQueryIterator<dynamic>(queryDefinition))
    {
        string itemstring = item.ToString();
        var kk = JsonConvert.DeserializeObject<ExpandoObject>(itemstring);
        result.Add(kk);

        Console.WriteLine("\tRead {0}\n",item);
    }
}

重要

您可以尝试使用以下代码。可以帮助您解决问题。

var query = new QueryDefinition("SELECT DISTINCT * FROM c IN s.categories");
var results = new List<dynamic>();

var resultSetIterator = container.GetItemQueryIterator<dynamic>(query);
while (resultSetIterator.HasMoreResults)
{
    var response = await resultSetIterator.ReadNextAsync();
    results.AddRange(response);
    if (response.Diagnostics != null)
    {
        Console.WriteLine($"\nQueryWithSqlParameters Diagnostics: {response.Diagnostics}");
    }
}

以下信息应为您提供帮助:

Cosmos DB Array Query Doesn't Work in .NET SDK