【发布时间】:2021-06-16 10:55:02
【问题描述】:
我在使用 ComsosDb .NET SDK 3 的 SQL 查询时出错。我想从文档中请求对象列表。 这是我存储在 CosmosDb 中的文档(fid 是分区键):
{
"id": "1abc",
"fid": "test",
"docType": "Peeps",
"People": [
{
"Name": "Bill",
"Age": 99
},
{
"Name": "Marion",
"Age": 98
},
{
"Name": "Seb",
"Age": 97
}
],
"_rid": "mo53AJczKUuL9gMAAAAAAA==",
"_self": "dbs/mo53AA==/colls/mo53AJczKUs=/docs/mo53AJczKUuL9gMAAAAAAA==/",
"_etag": "\"9001cbc7-0000-1100-0000-60c9d58d0000\"",
"_attachments": "attachments/",
"_ts": 1623840141
}
我的结果显示项目计数为 1,属性设置为默认值 - 名称为空,年龄为 0。 我期待一个 IEnumerable 3 人。代码如下:
class MyPeople
{
public IEnumerable<Person> People { get; set; }
}
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
[Fact]
public async Task CosmosPeopleTest_ReturnsThreePeople()
{
var config = GetConFig();
var cosmosClientV2 = new CosmosClient(config["Cosmos:ConnectionString"]);
var container = cosmosClientV2.GetContainer(config["Cosmos:DbName"], config["Cosmos:Collectionname"]);
var sql = "SELECT c.People FROM c WHERE c.docType = 'Peeps'";
QueryDefinition queryDefinition = new QueryDefinition(sql);
var results = new List<Person>();
FeedIterator<Person> q = container.GetItemQueryIterator<Person>(queryDefinition, null, new QueryRequestOptions { PartitionKey = new PartitionKey("test") });
while (q.HasMoreResults)
{
var x = await q.ReadNextAsync();
results.AddRange(x.ToList());
}
Assert.Equal(3, results.Count);
}
如果我将查询更改为
sql = "SELECT c.People FROM c JOIN d IN c.People";
我有三个人,它们都具有默认属性名称和年龄。
【问题讨论】:
-
您缺少一个根类。你得到的根对象不是一个人,而是 MyPeople。
-
我相信您的类型有问题。
SELECT c.People返回Person的列表,您的代码直接迭代Persons 而不是“Persons 的列表”。由于它使用重构,它创建了一个Person对象但无法填充其属性 -
很遗憾,我无法正确获取代码。
标签: c# azure-cosmosdb