#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. Прикрепил код в комментариях. И мне нужно учитывать временную метку, чтобы проверить, является ли запись последней или нет.