Запрос элементов в 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.