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

ŞUNUN IÇIN GEÇERLIDIR: NoSQL

Azure Cosmos DB'deki öğeler, kapsayıcı içinde depolanan varlıkları temsil eder. NoSQL API'sinde bir öğe, benzersiz tanımlayıcıya sahip JSON biçimli verilerden oluşur. NoSQL api'sini 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ını, filtreleri 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 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. HasMoreResults özelliği, 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 sorgu (LINQ) oluşturmak için bir IQueryable<> nesnesi 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, LINQ sorgu ifadesini içine FeedIterator<>dönüştürmek için yöntemi kullanılır.

İpucu

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

Sonraki adımlar

Birden çok öğeyi sorguladığınıza göre, NoSQL API'siyle uçtan uca öğreticilerimizden birini deneyin.