Запрос SQL API в CosmosDB с использованием C#

#c# #.net-core #azure-cosmosdb-sqlapi

#c# #.net-core #azure-cosmosdb-sqlapi

Вопрос:

Запрос SQL API в CosmosDB с использованием C# :

Мое требование — запросить jsonData из CosmosDB (SQL API). Приведенный ниже код выполняет эту работу, но для выполнения и возврата данных требуется 5-6 секунд.

             using (var cosmosClient = new CosmosClient(cosmosAccountEndpoint))
            {
                
                var sqlQueryText = "SELECT * FROM c where c.id = //our id";

                QueryDefinition queryDefinition = new QueryDefinition(sqlQueryText);

                FeedIterator<dynamic> queryResultSetIterator = cosmosClient.GetDatabase(databaseName).GetContainer(containerName).GetItemQueryIterator<dynamic>(queryDefinition);
                
                FeedResponse<dynamic> currentResultSet = await queryResultSetIterator.ReadNextAsync(); //this Line itself is taking 4-5 seconds time

                result = currentResultSet.Resource.ToList().FirstOrDefault(); //this line taking out the required response.
            }
            
            
            
  

В качестве альтернативы я пробую следующее (оно не работает). В приведенном ниже коде CollectionUri не загружается должным образом и работает через систему.Исключение InvalidOperationException.

                 using (var client = new DocumentClient("uri", "key", new ConnectionPolicy { ConnectionMode = Microsoft.Azure.Documents.Client.ConnectionMode.Gateway, ConnectionProtocol = Protocol.Tcp, RetryOptions = retryOptions }))
                {
                    var sqlQueryText = "SELECT * FROM c where c.id = //our id";
                    Uri collectionUri = Microsoft.Azure.Documents.Client.UriFactory.CreateDocumentCollectionUri(databaseName, containerName);
                    CustomersInfo = client.CreateDocumentQuery<dynamic>(collectionUri, new SqlQuerySpec() {QueryText = sqlQueryText,Parameters = new SqlParameterCollection() { } }, DefaultOptions).AsDocumentQuery();
                };
                
                
  

Есть ли какая-либо альтернатива первому коду ИЛИ какие-либо изменения, которые необходимо внести во второй код для работы…….

Заранее спасибо….

Ответ №1:

Вы запрашиваете один элемент?

Причина, по которой это так медленно, заключается в том, что это запрос между разделами.

Перепишите это как точечное чтение, т.Е.. Прочитайте функцию itemasync() и передайте значение ключа раздела, и это будет выполняться намного быстрее.

Кроме того, если это новое приложение, я рекомендую использовать v3 .NET SDK, а не v2 SDK. Это очень старое и не получает никаких новых улучшений.

Комментарии:

1. Привет, Марк, спасибо за ответ. Да, я запрашиваю один элемент. Но запрос основан на (идентификатор и временная метка записи). И когда я использую ReadItemAsync()-> я в конечном итоге получаю это исключение: ‘указанный для запроса ‘$resolveFor’ недопустим.

2. А также, я думаю, у нас не может быть сложного запроса с ReadItemAsync().

3. Я никогда раньше не видел эту ошибку. Если у вас есть идентификатор, зачем вам нужна временная метка? Можете ли вы показать свой код для того, как вы выполняете ReadItemAsync(). Для чтения точки в Cosmos вам нужны только идентификатор и значение ключа раздела.

4. использование (var cosmosClient = новый CosmosClient(cosmosAccountEndpoint)) { ItemResponse<динамический> queryResultSetIterator = ожидает cosmosClient. getDatabase(«Имя базы данных»). getContainer(«Имя_контейнера»). ReadItemAsync<динамический>(идентификатор, новый ключ раздела («/key»)); возвращает queryResultSetIterator. Ресурс; }

5. Прикрепил код в комментариях. И мне нужно учитывать временную метку, чтобы проверить, является ли запись последней или нет.