Сбой CosmosDB GetPropertyValue в foreachloop - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь запросить мой CosmosDB, а затем выполнить итерацию по каждому документу и получить значение из свойства, которое в нем используется, но по какой-то причине я получаю только ноль вместо значения

Метод запроса выглядиткак показано ниже

 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 всегда равен null

Я переписал свой метод следующим образом, но та же проблема сохраняется

 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 Ответ

2 голосов
/ 24 октября 2019

Совершенно нормально, что вы видите два скобки в вашем объекте, 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...
}
...