Udostępnij za pośrednictwem


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 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 języka Structured Query Language (SQL) do wykonywania zapytań dotyczących elementów w kontenerach. Proste zapytanie SQL, takie jak SELECT * FROM products , zwróci wszystkie elementy i właściwości z kontenera. Zapytania mogą być jeszcze bardziej złożone i obejmują określone 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 o 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 przyjęto założenie, że zdefiniowano już typ języka C#, aby reprezentować 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 wykonywać zapytania dotyczące elementów w kontenerze, wywołaj jedną z następujących metod:

Wykonywanie zapytań przy użyciu zapytania SQL asynchronicznie

W tym przykładzie zapytanie SQL jest kompilowane przy użyciu prostego ciągu, pobiera iterator kanału informacyjnego, a następnie używa zagnieżdżonych pętli do iterowania 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 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<> zwraca wartość FeedIterator<> używaną 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 do iterowania wyników.

Alternatywnie użyj metody 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}");
    }
}

Napiwek

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 zapytania 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 IQueryable w celu skompilowania zapytania LINQ. ToFeedIterator<> Następnie metoda jest używana do konwertowania wyrażenia zapytania LINQ na FeedIterator<>.

Napiwek

Chociaż można wykonać iterację w pliku IQueryable<>, ta operacja jest synchroniczna. ToFeedIterator<> Użyj metody , aby asynchronicznie zbierać wyniki.

Następne kroki

Teraz, gdy wykonano zapytanie dotyczące wielu elementów, wypróbuj jeden z naszych kompleksowego samouczka przy użyciu interfejsu API dla noSQL.