Aracılığıyla paylaş


.NET kullanarak NoSQL için Azure Cosmos DB'de öğeleri sorgulama

UYGULANANLAR: NoSQL

Azure Cosmos DB'deki öğeler bir kapsayıcıda depolanan varlıkları temsil eder. NoSQL API'sinde bir öğe, benzersiz tanımlayıcıya sahip JSON biçimli verilerden oluşur. NoSQL için API'yi kullanarak sorgular gönderdiğinizde, sonuçlar JSON belgelerinin JSON dizisi olarak döndürülür.

SQL kullanarak öğeleri sorgulama

NoSQL için Azure Cosmos DB, kapsayıcılardaki öğeler üzerinde sorgular gerçekleştirmek için Yapılandırılmış Sorgu Dili (SQL) kullanımını destekler. gibi SELECT * FROM products basit bir SQL sorgusu bir kapsayıcıdaki tüm öğeleri ve özellikleri döndürür. Sorgular daha da karmaşık olabilir ve belirli alan projeksiyonları, filtreler ve diğer yaygın SQL yan tümcelerini içerebilir:

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

NoSQL için Azure Cosmos DB'ye yönelik SQL söz dizimi hakkında daha fazla bilgi edinmek için bkz . SQL sorgularını kullanmaya başlama.

Öğeyi sorgulama

Not

Bu makaledeki örneklerde, Product adlı verilerinizi temsil etmek için zaten bir C# türü tanımladığınız varsayılır:

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

Kapsayıcıdaki öğeleri sorgulamak için aşağıdaki yöntemlerden birini çağırın:

SQL sorgusunu zaman uyumsuz olarak kullanarak öğeleri sorgulama

Bu örnek basit bir dize kullanarak bir SQL sorgusu oluşturur, bir akış yineleyicisi alır ve ardından sonuçları yinelemek için iç içe döngüleri kullanır. Dış while döngüsü sonuç sayfalarında yinelenirken iç foreach döngüsü bir sayfadaki sonuçlar üzerinde yinelenir.

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

Container.GetItemQueryIterator<> yöntemi, çok sayfalı sonuçlar arasında yineleme yapmak için kullanılan bir FeedIterator<> döndürür. özelliği, HasMoreResults daha fazla sonuç sayfası olup olmadığını gösterir. yöntemi, ReadNextAsync sonuçların sonraki sayfasını, sonuçları yinelemek için döngüde kullanılan bir numaralandırılabilir olarak alır.

Alternatif olarak, queryDefinition kullanarak parametreli giriş içeren bir SQL sorgusu oluşturun:

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

İpucu

Parametreli giriş değerleri birçok yaygın SQL sorgu ekleme saldırısını önlemeye yardımcı olabilir.

LINQ'i zaman uyumsuz olarak kullanarak öğeleri sorgulama

Bu örnekte, Dil Tümleşik Sorgusu (LINQ) oluşturmak için bir IQueryable<> nesne kullanılır. Ardından sonuçlar, akış yineleyicisi kullanılarak yinelenir.

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

Container.GetItemLinqQueryable<> yöntemi, LINQ sorgusunu oluşturmak için bir IQueryable oluşturur. ToFeedIterator<> Ardından yöntemi LINQ sorgu ifadesini içine FeedIterator<>dönüştürmek için kullanılır.

İpucu

üzerinde IQueryable<>yineleme yapabilirsiniz ancak bu işlem zaman uyumlu olur. ToFeedIterator<> Zaman uyumsuz olarak sonuç toplamak için yöntemini kullanın.

Sonraki adımlar

Artık birden çok öğeyi sorguladığınıza göre, NoSQL için API ile uçtan uca öğreticilerimizden birini deneyin.