Запрос элементов в Azure Cosmos DB для NoSQL с помощью .NET
ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL
Элементы в Azure Cosmos DB представляют сущности, хранящиеся в контейнере. В API для NoSQL элемент состоит из отформатированных в формате JSON данных с уникальным идентификатором. При выполнении запросов с помощью API для NoSQL результаты возвращаются в виде массива JSON документов JSON.
Запрашивание элементов с помощью SQL
Azure Cosmos DB для NoSQL поддерживает использование язык SQL (SQL) для выполнения запросов к элементам в контейнерах. Простой запрос SQL, например SELECT * FROM products
, возвращает все элементы и свойства из контейнера. Запросы могут быть еще более сложными и включать определенные проекции полей, фильтры и другие общие предложения SQL.
SELECT
p.name,
p.description AS copy
FROM
products p
WHERE
p.price > 500
Дополнительные сведения о синтаксисе SQL для Azure Cosmos DB для NoSQL см. в статье "Начало работы с запросами SQL".
Запрос элемента
Примечание.
В примерах в этой статье предполагается, что вы уже определили тип C# для представления ваших данных с именем Product.
// C# record type for items in the container
public record Product(
string id,
string category,
string name,
int quantity,
bool sale
);
Для запрашивания элементов в контейнере вызовите один из следующих методов:
Запрашивание элементов с помощью запроса SQL асинхронно
В этом примере создается запрос SQL с использованием простой строки, извлекается итератор канала, а затем используются вложенные циклы для перебора результатов. Внешний цикл while перебирает страницы результатов, а внутренний цикл foreach перебирает результаты внутри страницы.
// Query multiple items from container
using FeedIterator<Product> feed = container.GetItemQueryIterator<Product>(
queryText: "SELECT * FROM products p WHERE p.quantity > 10"
);
// Iterate query result pages
while (feed.HasMoreResults)
{
FeedResponse<Product> response = await feed.ReadNextAsync();
// Iterate query results
foreach (Product item in response)
{
Console.WriteLine($"Found item:\t{item.name}");
}
}
Метод Container.GetItemQueryIterator<> возвращает FeedIterator<>
для выполнения итерации по многостраничным результатам. Свойство HasMoreResults
указывает, остались ли еще страницы результатов. Метод ReadNextAsync
получает следующую страницу результатов в виде перечисляемого элемента, который затем используется в цикле для перебора результатов.
Кроме того, вы можете использовать QueryDefinition для создания запроса SQL с параметризованными входными данными.
// Build query definition
var parameterizedQuery = new QueryDefinition(
query: "SELECT * FROM products p WHERE p.quantity > @quantity"
)
.WithParameter("@quantity", 10);
// Query multiple items from container
using FeedIterator<Product> filteredFeed = container.GetItemQueryIterator<Product>(
queryDefinition: parameterizedQuery
);
// Iterate query result pages
while (filteredFeed.HasMoreResults)
{
FeedResponse<Product> response = await filteredFeed.ReadNextAsync();
// Iterate query results
foreach (Product item in response)
{
Console.WriteLine($"Found item:\t{item.name}");
}
}
Совет
Параметризованные входные значения могут помочь предотвратить многие распространенные атаки с внедрением запросов SQL.
Запрашивание элементов с помощью LINQ асинхронно
В этом примере объект IQueryable
<> используется для создания запроса LINQ. Затем выполняется итерация по результатам с использованием итератора каналов.
// Get LINQ IQueryable object
IOrderedQueryable<Product> queryable = container.GetItemLinqQueryable<Product>();
// Construct LINQ query
var matches = queryable
.Where(p => p.quantity > 10);
// Convert to feed iterator
using FeedIterator<Product> linqFeed = matches.ToFeedIterator();
// Iterate query result pages
while (linqFeed.HasMoreResults)
{
FeedResponse<Product> response = await linqFeed.ReadNextAsync();
// Iterate query results
foreach (Product item in response)
{
Console.WriteLine($"Matched item:\t{item.name}");
}
}
Метод Container.GetItemLinqQueryable<> создает IQueryable
для создания запроса LINQ. Затем метод ToFeedIterator<>
используется для преобразования выражения запроса LINQ в FeedIterator<>
.
Совет
Хотя вы можете выполнять итерацию по IQueryable<>
, эта операция является синхронной. Используйте метод ToFeedIterator<>
для асинхронного сбора результатов.
Следующие шаги
Теперь, когда вы запросили несколько элементов, попробуйте одно из наших комплексных руководств с ПОМОЩЬЮ API для NoSQL.