问题描述
我正在尝试查询一个数据库,其中存储的实体具有不同的属性,并且我想通过不同形状的查询(这就是使用无模式数据库的要点)从此信息中检索某些字段,但是我没有运气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获取动态投影的其他想法?
谢谢!
解决方法
更新
我发现我们可以通过以下代码获得结果。
我们可以从动态视图中查看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}");
}
}
以下信息应为您提供帮助: