Wykonywanie zapytań o elementy w usłudze Azure Cosmos DB for NoSQL przy użyciu platformy .NET

DOTYCZY: NoSQL

Elementy w usłudze Azure Cosmos DB reprezentują jednostki przechowywane w kontenerze. W interfejsie API for NoSQL element składa się z danych sformatowanych w formacie JSON z unikatowym identyfikatorem. W przypadku wystawiania zapytań przy użyciu interfejsu API dla noSQL wyniki są zwracane jako tablica JSON dokumentów JSON.

Wykonywanie zapytań o elementy przy użyciu języka SQL

Usługa Azure Cosmos DB for NoSQL obsługuje używanie Structured Query Language (SQL) do wykonywania zapytań dotyczących elementów w kontenerach. Proste zapytanie SQL, takie jak SELECT * FROM products zwraca wszystkie elementy i właściwości z kontenera. Zapytania mogą być jeszcze bardziej złożone i obejmują konkretne projekcje pól, filtry i inne typowe klauzule SQL:

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

Aby dowiedzieć się więcej na temat składni SQL dla usługi Azure Cosmos DB for NoSQL, zobacz Wprowadzenie do zapytań SQL.

Wykonywanie zapytań względem elementu

Uwaga

W przykładach w tym artykule założono, że zdefiniowano już typ języka C#reprezentujący dane o nazwie Product:

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

Aby wysłać zapytanie o elementy w kontenerze, wywołaj jedną z następujących metod:

Wykonywanie zapytań przy użyciu zapytania SQL asynchronicznie

W tym przykładzie kompiluje zapytanie SQL przy użyciu prostego ciągu, pobiera iterator kanału informacyjnego, a następnie używa zagnieżdżonych pętli w celu iteracji wyników. Zewnętrzna pętla while będzie iterować przez strony wyników, podczas gdy wewnętrzna pętla foreach iteruje wyniki na stronie.

// Query multiple items from container
using FeedIterator<Product> feed = container.GetItemQueryIterator<Product>(
    queryText: "SELECT * FROM products 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<> zwraca FeedIterator<> wartość, która służy do iterowania wyników wielostronicowych. Właściwość HasMoreResults wskazuje, czy pozostało więcej stron wyników. Metoda ReadNextAsync pobiera następną stronę wyników jako wyliczenie, które jest następnie używane w pętli w celu iteracji wyników.

Alternatywnie użyj polecenia QueryDefinition , aby utworzyć zapytanie SQL z sparametryzowanymi danymi wejściowymi:

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

Porada

Sparametryzowane wartości wejściowe mogą pomóc w zapobieganiu wielu typowym atakom polegającym na wstrzyknięciu zapytań SQL.

Wykonywanie zapytań o elementy przy użyciu asynchronicznego linQ

W tym przykładzie IQueryable<> obiekt jest używany do konstruowania zapytania zintegrowanego języka (LINQ). Wyniki są następnie iterowane przy użyciu iteratora kanału informacyjnego.

// 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<> tworzy obiekt w IQueryable celu skompilowania zapytania LINQ. ToFeedIterator<> Następnie metoda służy do konwertowania wyrażenia zapytania LINQ na .FeedIterator<>

Porada

Chociaż można iterować w obiekcie IQueryable<>, ta operacja jest synchroniczna. Użyj metody , ToFeedIterator<> aby zebrać wyniki asynchronicznie.

Następne kroki

Teraz, gdy wykonano zapytanie o wiele elementów, wypróbuj jeden z naszych kompleksowego samouczka z interfejsem API for NoSQL.