Sdílet prostřednictvím


Dotazování položek ve službě Azure Cosmos DB for NoSQL pomocí .NET

PLATÍ PRO: NoSQL

Položky ve službě Azure Cosmos DB představují entity uložené v kontejneru. V rozhraní API pro NoSQL se položka skládá z dat ve formátu JSON s jedinečným identifikátorem. Při vydávání dotazů pomocí rozhraní API pro NoSQL se výsledky vrátí jako pole JSON dokumentů JSON.

Dotazování položek pomocí SQL

Azure Cosmos DB for NoSQL podporuje použití jazyk SQL (Structured Query Language) (SQL) k provádění dotazů na položky v kontejnerech. Jednoduchý dotaz SQL, jako SELECT * FROM products je, vrátí všechny položky a vlastnosti z kontejneru. Dotazy můžou být ještě složitější a zahrnují konkrétní projekce polí, filtry a další běžné klauzule SQL:

SELECT 
    p.name, 
    p.description AS copy
FROM 
    products p 
WHERE 
    p.price > 500

Další informace o syntaxi SQL pro Azure Cosmos DB for NoSQL najdete v tématu Začínáme s dotazy SQL.

Dotazování položky

Poznámka:

Příklady v tomto článku předpokládají, že jste již definovali typ jazyka C#, který představuje vaše data s názvem Product:

// C# record type for items in the container
public record Product(
    string id,
    string category,
    string name,
    int quantity,
    bool sale
);

Pokud chcete dotazovat položky v kontejneru, zavolejte jednu z následujících metod:

Dotazování položek pomocí dotazu SQL asynchronně

Tento příklad sestaví dotaz SQL pomocí jednoduchého řetězce, načte iterátor informačního kanálu a pak pomocí vnořených smyček iteruje výsledky. Vnější smyčka while iteruje stránky výsledků, zatímco vnitřní smyčka foreach iteruje výsledky na stránce.

// 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}");
    }
}

Metoda Container.GetItemQueryIterator<> vrátí metodu FeedIterator<> , která se používá k iteraci prostřednictvím výsledků s více stránkami. Tato HasMoreResults vlastnost označuje, jestli zbývá více výsledných stránek. Metoda ReadNextAsync získá další stránku výsledků jako výčet, který se pak použije ve smyčce iterace výsledků.

Alternativně použijte QueryDefinition k sestavení dotazu SQL s parametrizovaným vstupem:

// 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}");
    }
}

Tip

Parametrizované vstupní hodnoty můžou pomoct zabránit mnoha běžným útokům prostřednictvím injektáže dotazů SQL.

Dotazování položek pomocí LINQ asynchronně

V tomto příkladu IQueryable<> se objekt používá k vytvoření jazyka Integrated Query (LINQ). Výsledky se pak iterují pomocí iterátoru informačního kanálu.

// 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}");
    }
}

Metoda Container.GetItemLinqQueryable<> vytvoří IQueryable dotaz LINQ. ToFeedIterator<> Pak se metoda použije k převodu výrazu dotazu LINQ na .FeedIterator<>

Tip

I když můžete iterovat nad , IQueryable<>tato operace je synchronní. ToFeedIterator<> Pomocí metody můžete asynchronně shromáždit výsledky.

Další kroky

Teď, když jste se dotazovali na více položek, vyzkoušejte jeden z našich kompletních kurzů s rozhraním API pro NoSQL.