Abfragen von Elementen in Azure Cosmos DB for NoSQL mithilfe von .NET
GILT FÜR: NoSQL
Elemente in Azure Cosmos DB stellen Entitäten dar, die in einem Container gespeichert sind. In der API für NoSQL besteht ein Element aus Daten im JSON-Format mit einem eindeutigen Bezeichner. Wenn Sie Abfragen mithilfe der API für NoSQL ausführen, werden Ergebnisse als ein JSON-Array von JSON-Dokumenten zurückgegeben.
Abfragen von Elementen mit SQL
Azure Cosmos DB for NoSQL unterstützt die Verwendung von Structured Query Language (SQL) zum Abfragen von Elementen in Containern. Eine einfache SQL-Abfrage wie SELECT * FROM products
gibt alle Elemente und Eigenschaften aus einem Container zurück. Abfragen können allerdings auch komplexer sein und spezifische Feldprojektionen, Filter und andere gängige SQL-Klauseln enthalten:
SELECT
p.name,
p.description AS copy
FROM
products p
WHERE
p.price > 500
Weitere Informationen zur SQL-Syntax für Azure Cosmos DB for NoSQL finden Sie unter Erste Schritte mit SQL-Abfragen.
Abfragen eines Elements
Hinweis
In den Beispielen dieses Artikels wird davon ausgegangen, dass Sie bereits einen C#-Typ namens Product definiert haben, der Ihre Daten darstellt:
// C# record type for items in the container
public record Product(
string id,
string category,
string name,
int quantity,
bool sale
);
Rufen Sie eine der folgenden Methoden auf, um Elemente in einem Container abzufragen:
Abfragen von Elementen mithilfe einer asynchronen SQL-Abfrage
In diesem Beispiel wird eine SQL-Abfrage mit einer einfachen Zeichenfolge erstellt und ein Feediterator abgerufen. Anschließend werden geschachtelte Schleifen verwendet, um die Ergebnisse zu durchlaufen. Die äußere Schleife vom Typ while durchläuft die Ergebnisseiten, während die innere Schleife vom Typ foreach die Ergebnisse innerhalb einer Seite durchläuft.
// 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}");
}
}
Die Methode Container.GetItemQueryIterator<> gibt einen Feediterator (FeedIterator<>
) zurück, der zum Durchlaufen mehrseitiger Ergebnisse verwendet wird. Die Eigenschaft HasMoreResults
gibt an, ob noch weitere Ergebnisseiten vorhanden sind. Die Methode ReadNextAsync
ruft die nächste Ergebnisseite als aufzählbares Element ab. Dieses wird dann in einer Schleife verwendet, um die Ergebnisse zu durchlaufen.
Verwenden Sie alternativ die Abfragedefinition (QueryDefinition), um eine SQL-Abfrage mit parametrisierter Eingabe zu erstellen:
// 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}");
}
}
Tipp
Durch die Verwendung parametrisierter Eingabewerte lassen sich zahlreiche gängige SQL-Abfrageeinschleusungsangriffe verhindern.
Asynchrones Abfragen von Elementen mithilfe von LINQ
In diesem Beispiel wird ein Objekt vom Typ IQueryable
<> verwendet, um eine sprachintegrierte Abfrage (Language Integrated Query, LINQ) zu erstellen. Die Ergebnisse werden dann mithilfe eines Feediterators durchlaufen.
// 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}");
}
}
Die Methode Container.GetItemLinqQueryable<> erstellt ein Element vom Typ IQueryable
, um die LINQ-Abfrage zu erstellen. Anschließend wird die Methode ToFeedIterator<>
verwendet, um den LINQ-Abfrageausdruck in einen Feediterator (FeedIterator<>
) umzuwandeln.
Tipp
Sie können zwar IQueryable<>
durchlaufen, dieser Vorgang ist jedoch synchron. Verwenden Sie die Methode ToFeedIterator<>
, um Ergebnisse asynchron zu sammeln.
Nächste Schritte
Nachdem Sie mehrere Elemente abgefragt haben, probieren Sie jetzt eines unserer End-to-End-Tutorials mit der API für NoSQL aus.