Dela via


Fråga efter objekt i Azure Cosmos DB för NoSQL med hjälp av .NET

GÄLLER FÖR: NoSQL

Objekt i Azure Cosmos DB representerar entiteter som lagras i en container. I API:et för NoSQL består ett objekt av JSON-formaterade data med en unik identifierare. När du utfärdar frågor med hjälp av API:et för NoSQL returneras resultaten som en JSON-matris med JSON-dokument.

Fråga efter objekt med SQL

Azure Cosmos DB for NoSQL stöder användning av Structured Query Language (SQL) för att utföra frågor på objekt i containrar. En enkel SQL-fråga som SELECT * FROM products returnerar alla objekt och egenskaper från en container. Frågor kan vara ännu mer komplexa och innehålla specifika fältprojektioner, filter och andra vanliga SQL-satser:

SELECT 
    p.name, 
    p.description AS copy
FROM 
    products p 
WHERE 
    p.price > 500

Mer information om SQL-syntaxen för Azure Cosmos DB för NoSQL finns i Komma igång med SQL-frågor.

Fråga efter ett objekt

Kommentar

Exemplen i den här artikeln förutsätter att du redan har definierat en C#-typ för att representera dina data med namnet Product:

// C# record type for items in the container
public record Product(
    string id,
    string category,
    string name,
    int quantity,
    bool sale
);

Om du vill fråga efter objekt i en container anropar du någon av följande metoder:

Fråga objekt med hjälp av en SQL-fråga asynkront

Det här exemplet skapar en SQL-fråga med en enkel sträng, hämtar en feed-iterator och använder sedan kapslade loopar för att iterera över resultat. Den yttre while-loopen itererar genom resultatsidor, medan den inre foreach-loopen itererar över resultaten på en sida.

// 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}");
    }
}

Metoden Container.GetItemQueryIterator<> returnerar ett FeedIterator<> som används för att iterera genom flersidiga resultat. Egenskapen HasMoreResults anger om det finns fler resultatsidor kvar. Metoden ReadNextAsync hämtar nästa sida med resultat som en uppräkningsbar som sedan används i en loop för att iterera över resultat.

Du kan också använda QueryDefinition för att skapa en SQL-fråga med parametriserade indata:

// 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}");
    }
}

Dricks

Parameteriserade indatavärden kan hjälpa till att förhindra många vanliga SQL-frågeinmatningsattacker.

Fråga efter objekt med LINQ asynkront

I det här exemplet används ett IQueryable<> objekt för att konstruera en LINQ (Language Integrated Query). Resultatet itereras sedan över med hjälp av en feed-iterator.

// 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}");
    }
}

Metoden Container.GetItemLinqQueryable<> konstruerar en IQueryable för att skapa LINQ-frågan. ToFeedIterator<> Sedan används metoden för att konvertera LINQ-frågeuttrycket till en FeedIterator<>.

Dricks

Även om du kan iterera över är den IQueryable<>här åtgärden synkron. ToFeedIterator<> Använd metoden för att samla in resultat asynkront.

Nästa steg

Nu när du har frågat flera objekt kan du prova någon av våra självstudier från slutpunkt till slutpunkt med API:et för NoSQL.