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.