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.