Elemek lekérdezése az Azure Cosmos DB for NoSQL-ben a .NET használatával
A KÖVETKEZŐRE VONATKOZIK: NoSQL
Az Azure Cosmos DB elemei egy tárolóban tárolt entitásokat jelölnek. A NoSQL API-ban egy elem JSON-formátumú adatokat tartalmaz egyedi azonosítóval. Amikor lekérdezéseket ad ki a NoSQL API-val, a rendszer JSON-dokumentumok JSON-tömbjeként adja vissza az eredményeket.
Elemek lekérdezése AZ SQL használatával
Az Azure Cosmos DB for NoSQL támogatja a strukturált lekérdezési nyelv (SQL) használatát a tárolók elemein végzett lekérdezések végrehajtásához. Egy egyszerű SQL-lekérdezés, például SELECT * FROM products
egy tároló összes elemét és tulajdonságát visszaadja. A lekérdezések még összetettebbek lehetnek, és konkrét mezővetítéseket, szűrőket és más gyakori SQL-záradékokat is tartalmazhatnak:
SELECT
p.name,
p.description AS copy
FROM
products p
WHERE
p.price > 500
Az Azure Cosmos DB for NoSQL SQL-szintaxisával kapcsolatos további információkért tekintse meg az SQL-lekérdezések használatának első lépéseit.
Elem lekérdezése
Feljegyzés
A cikkben szereplő példák feltételezik, hogy már definiált egy C#-típust a Product (Termék) nevű adatok megjelenítéséhez:
// C# record type for items in the container
public record Product(
string id,
string category,
string name,
int quantity,
bool sale
);
Egy tároló elemeinek lekérdezéséhez hívja meg az alábbi módszerek egyikét:
Sql-lekérdezést használó elemek lekérdezése aszinkron módon
Ez a példa egy SQL-lekérdezést hoz létre egy egyszerű sztring használatával, lekéri a hírcsatorna-iterátort, majd beágyazott hurkokat használ az eredmények iterálásához. A külső ciklus végighalad az eredményoldalakon, míg a belső foreach hurok iterálja az eredményeket egy oldalon belül.
// 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}");
}
}
A Container.GetItemQueryIterator<> metódus egy FeedIterator<>
olyan értéket ad vissza, amelyet többoldalas eredményeken keresztüli iterálásra használnak. A HasMoreResults
tulajdonság azt jelzi, hogy több eredményoldal van-e még hátra. A ReadNextAsync
metódus az eredmények következő oldalát számba veszi, amelyet aztán egy ciklusban használnak az eredmények iterálásához.
Másik lehetőségként a QueryDefinition használatával létrehozhat egy SQL-lekérdezést paraméteres bemenettel:
// 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.
A paraméteres bemeneti értékek segíthetnek megelőzni számos gyakori SQL-lekérdezésinjektálási támadást.
Elemek lekérdezése linq aszinkron módon
Ebben a példában egy IQueryable
<> objektumot használunk a Language Integrated Query (LINQ) létrehozásához. Az eredmények ezután át lesznek iterálva egy hírcsatorna-iterátor használatával.
// 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}");
}
}
A Container.GetItemLinqQueryable<> metódus létrehoz egy IQueryable
linq lekérdezést. Ezután a ToFeedIterator<>
linq lekérdezési kifejezés konvertálása a metódussal történik FeedIterator<>
.
Tipp.
Bár át tudja űzni a IQueryable<>
műveletet, ez a művelet szinkronban van. A metódussal aszinkron ToFeedIterator<>
módon gyűjthet eredményeket.
Következő lépések
Most, hogy több elemet is lekérdezett, próbálja ki az egyik végpontok közötti oktatóanyagot a NoSQL API-val.