CosmosDB GetPropertyValue не работает в цикле foreachloop
Я пытаюсь запросить свой CosmosDB, а затем перебрать каждый документ и получить значение из свойства в нем для использования, но по какой-то причине я получаю только null вместо значения
Метод запроса выглядит следующим образом
private async Task<FeedResponse<Document>> FetchDocuments(string brand)
{
using (var client = new DocumentClient(new Uri(cosmosDBEndpointUrl), cosmosDBPrimaryKey))
{
FeedOptions queryOptions = new FeedOptions
{
MaxItemCount = 0,
PartitionKey = new PartitionKey(brand)
};
var query = client.CreateDocumentQuery<Document>(UriFactory.CreateDocumentCollectionUri(cosmosDBName, cosmosDBCollectionNameRawData), $"SELECT * from c where c.brand = \"{brand}\"", queryOptions).AsDocumentQuery();
var result = await query.ExecuteNextAsync<Document>();
return result;
}
}
Затем я просматриваю результат следующим образом
var rawDataDocumentList = await FetchDocuments(brand);
foreach (var singleDoc in rawDataDocumentList)
{
string jongel = singleDoc.GetPropertyValue<string>("OriginalData.artno");
}
если я прерву цикл, я вижу, что у меня есть реальные данные, но по какой-то причине он начинается и заканчивается {{ }}, где я ожидал одного { } pr, может быть, мне что-то здесь не хватает? ну, я знаю, что я что-то упускаю, вопрос в том, что, поскольку jongel всегда равен нулю
Я переписал свой метод следующим образом, но проблема не исчезла.
private async Task<List<String>> FetchDocuments(string brand)
{
using (var client = new DocumentClient(new Uri(cosmosDBEndpointUrl), cosmosDBPrimaryKey))
{
List<string> documentListInLoop = new List<string>();
FeedOptions queryOptions = new FeedOptions
{
MaxItemCount = -1,
PartitionKey = new PartitionKey(brand)
};
var query = client.CreateDocumentQuery<Document>(UriFactory.CreateDocumentCollectionUri(cosmosDBName, cosmosDBCollectionNameRawData), $"SELECT * from c where c.brand = \"{brand}\"", queryOptions).AsDocumentQuery();
while(query.HasMoreResults)
{
foreach (Document singleDocument in await query.ExecuteNextAsync<Document>())
{
string artNo = singleDocument.GetPropertyValue<string>("OriginalData.artno");
documentListInLoop.Add(Newtonsoft.Json.JsonConvert.SerializeObject(singleDocument.ToString()));
}
}
//var result = await query.ExecuteNextAsync<Document>();
return documentListInLoop;
}
}
Я могу увидеть свойство artno, если поставлю точку останова, и это будет выглядеть следующим образом
{{
"brand": "XX",
"UpdatedAt": "2019-10-24T00:31:18",
"OriginalData": {
"id": "a2303ce5-bb28-4d90-90ad-f741327b416a",
"_id": "5da4eec9ee3b9100013f7e49",
"artno": "0697054056",
"vendor": "hm",
"updatedAt": "2019-10-22T22:02:01.365Z",
"locales": [
Я обрезал это, чтобы сэкономить место, так как вы видите, что он начинается с двойных угловых скобок, не знаете, почему?
И я не могу получить какую-либо ценность для artno, хотя он явно там, поэтому я должен получить доступ не так, но я не могу понять, что я делаю неправильно.
1 ответ
Совершенно нормально, что вы видите в своем объекте две скобки, Visual Studio добавляет их в предварительный просмотр свойства. Следующее, что вы хотите получить доступ к вложенному свойству документа. Поэтому вы можете получить свойство json следующим образом:
using Newtonsoft.Json.Linq;
foreach (Document singleDocument in await query.ExecuteNextAsync<Document>())
{
string artNo = singleDocument.GetPropertyValue<JObject>("OriginalData")["artno"]?.ToString();
// some other code...
}