【问题标题】:Obtain a list of dynamic objects from a CosmosDB database with .NET SDK v.4使用 .NET SDK v.4 从 CosmosDB 数据库中获取动态对象列表
【发布时间】:2020-09-01 23:12:38
【问题描述】:

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

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

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);
}

但我得到的项目是 System.Text.Json.JsonDocument 类型,所以它不能按预期工作;

如果我尝试使用 ExpandoObjects,我无法使用新的 System.Text.Json 序列化程序反序列化结果,因为截至今天它不支持反序列化为 ExpandoObjects:

results.Add(JsonSerializer.Deserialize<ExpandoObject>(item));

目前唯一可行的方法是使用旧的 Newtonsoft Json 序列化程序,但在我看来,将这两个库都存在于应用程序中似乎有点过头了,这意味着所有这些。

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

提前致谢!

【问题讨论】:

  • 您的问题解决了吗?有进展吗?

标签: .net azure-cosmosdb azure-cosmosdb-sqlapi


【解决方案1】:

更新

我发现我们可以通过下面的代码得到结果。

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

你可以用关键字dynamic view as object c#谷歌搜索。

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

【讨论】:

  • 感谢您的建议,但在 .NET SDK v4 上没有 HasMoreResults 方法,取而代之的是等待的 foreach,所以我不知道如何获取 response.Diagnostics 对象...跨度>
  • 问题中说我不想使用旧的 Newtonsoft Json 反序列化器,所以你的回答没有太大帮助(我已经这样做了)。谢谢,无论如何我赞成它,但不能将其标记为已接受,因为这不是我所要求的......
猜你喜欢
  • 1970-01-01
  • 2020-03-08
  • 2022-01-22
  • 2015-03-07
  • 2021-02-03
  • 2021-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多