.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.