Megosztás a következőn keresztül:


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.