NoSQL için Azure Cosmos DB'de LINQ to NoSQL çevirisi
UYGULANANLAR: NoSQL
Azure Cosmos DB sorgu sağlayıcısı, LINQ sorgusundan NoSQL için Azure Cosmos DB sorgusuna en iyi şekilde eşleme gerçekleştirir. LINQ'den çevrilen NoSQL sorgusunu almak istiyorsanız, oluşturulan IQueryable
nesnede yöntemini kullanınToString()
. Aşağıdaki açıklama LINQ ile ilgili temel bir bilgi olduğunu varsayar. LINQ'e ek olarak Azure Cosmos DB, NoSQL için API ile çalışan Entity Framework Core'ı da destekler.
Sorgu sağlayıcısı türü sistemi yalnızca JSON temel türlerini destekler: numeric
, Boolean
, string
ve null
.
Sorgu sağlayıcısı aşağıdaki skaler ifadeleri destekler:
Sorgu değerlendirme zamanında ilkel veri türlerinin sabit değerleri de dahil olmak üzere sabit değerler.
Bir nesnenin veya dizi öğesinin özelliğine başvuran özellik/dizi dizin ifadeleri. Örneğin:
family.Id; family.children[0].familyName; family.children[0].grade;
int n = 1; family.children[n].grade;
Sayısal ve Boole değerleri üzerindeki yaygın aritmetik ifadeler de dahil olmak üzere aritmetik ifadeler.
2 * family.children[0].grade; x + y;
Bir dize değerini sabit bir dize değeriyle karşılaştırmayı içeren dize karşılaştırma ifadeleri.
mother.familyName.StringEquals("Wakefield");
string s = "Rob"; string e = "in"; string c = "obi"; child.givenName.StartsWith(s); child.givenName.EndsWith(e); child.givenName.Contains(c);
Bileşik değer türünde veya anonim türde bir nesne ya da bu tür nesnelerin dizisini döndüren nesne/dizi oluşturma ifadeleri. Bu değerleri iç içe yerleştirebilirsiniz.
new Parent { familyName = "Wakefield", givenName = "Robin" }; new { first = 1, second = 2 }; //an anonymous type with two fields new int[] { 3, child.grade, 5 };
LINQ kullanma
ile GetItemLinqQueryable
bir LINQ sorgusu oluşturabilirsiniz. Bu örnekte LINQ sorgu oluşturma ve ile zaman uyumsuz yürütme gösterilmektedir FeedIterator
:
using FeedIterator<Book> setIterator = container.GetItemLinqQueryable<Book>()
.Where(b => b.Title == "War and Peace")
.ToFeedIterator<Book>());
//Asynchronous query execution
while (setIterator.HasMoreResults)
{
foreach(var item in await setIterator.ReadNextAsync()){
{
Console.WriteLine(item.cost);
}
}
Desteklenen LINQ işleçleri
NoSQL .NET SDK'sı ile birlikte gelen LINQ sağlayıcısı aşağıdaki işleçleri destekler:
- Seç: Projeksiyonlar nesne oluşturma dahil olmak üzere SELECT'e çevrilir.
- Nerede: Filtreler WHERE'a çevrilir ve ,
||
ve!
NoSQL işleçleri arasında&&
çeviriyi destekler - SelectMany: DIZIlerin JOIN yan tümcesine geri sarmasını sağlar. Dizi öğelerine filtre uygulamak için ifadeleri zincirleme veya iç içe yerleştirme için kullanın.
- OrderBy ve OrderByDescending: ASC veya DESC ile ORDER BY'a çevirin.
- Toplama için Count, Sum, Min, Max ve Average işleçleri ve bunların zaman uyumsuz eşdeğerleri CountAsync, SumAsync, MinAsync, MaxAsync ve AverageAsync.
- CompareTo: Aralık karşılaştırmalarına çevirir. Bu işleç, .NET'te karşılaştırılmadığından genellikle dizeler için kullanılır.
- Atla ve Al: Sorgudan gelen sonuçları sınırlamak ve sayfalandırma yapmak için OFFSET ve LIMIT'e çevirir.
- Matematik işlevleri: .NET
Abs
, ,Acos
,Asin
,Atan
,Ceiling
, ,Cos
, ,Exp
, ,Floor
,Log10
Sign
Log
Sqrt
Tan
Sin
Pow
Round
veTruncate
eşdeğer yerleşik matematik işlevlerine çeviriyi destekler. - Dize işlevleri: .NET
Concat
, , ,Count
Contains
,EndsWith
IndexOf
, ,Replace
, ,Reverse
,ToUpper
TrimEnd
ToLower
StartsWith
SubString
veTrimStart
eşdeğer yerleşik dize işlevlerine çeviriyi destekler. - Dizi işlevleri: .NET
Concat
,Contains
veCount
'den eşdeğer yerleşik dizi işlevlerine çeviriyi destekler. - Jeo-uzamsal Uzantı işlevleri: saplama yöntemleri
Distance
, ,IsValid
IsValidDetailed
ve'denWithin
eşdeğer yerleşik jeo-uzamsal işlevlere çeviriyi destekler. - Kullanıcı Tanımlı İşlev Uzantısı işlevi: CosmosLinq.InvokeUserDefinedFunction saplama yönteminden ilgili kullanıcı tanımlı işleve çeviriyi destekler.
- Çeşitli: ve koşullu işleçlerin çevirisini
Coalesce
destekler. Bağlama bağlı olarak Dize İÇERİSİ, ARRAY_CONTAINS veya IN olarak çevrilebilirContains
.
Örnekler
Aşağıdaki örneklerde standart LINQ sorgu işleçlerinden bazılarının Azure Cosmos DB'deki sorgulara nasıl çevrildiği gösterilmektedir.
İşleç seçme
Söz dizimi , input.Select(x => f(x))
burada f
skaler bir ifadedir. input
, bu durumda bir IQueryable
nesne olacaktır.
İşleci seçin, örnek 1:
LINQ lambda ifadesi
input.Select(family => family.parents[0].familyName);
NoSQL
SELECT VALUE f.parents[0].familyName FROM Families f
Işleç seçin, örnek 2:
LINQ lambda ifadesi
input.Select(family => family.children[0].grade + c); // c is an int variable
NoSQL
SELECT VALUE f.children[0].grade + c FROM Families f
İşleci seçin, örnek 3:
LINQ lambda ifadesi
input.Select(family => new { name = family.children[0].familyName, grade = family.children[0].grade + 3 });
NoSQL
SELECT VALUE { "name":f.children[0].familyName, "grade": f.children[0].grade + 3 } FROM Families f
SelectMany işleci
Söz dizimi, input.SelectMany(x => f(x))
burada f
kapsayıcı türü döndüren bir skaler ifadedir.
LINQ lambda ifadesi
input.SelectMany(family => family.children);
NoSQL
SELECT VALUE child FROM child IN Families.children
Where işleci
Söz dizimi, input.Where(x => f(x))
burada f
Boole değeri döndüren bir skaler ifadedir.
Where işleci, örnek 1:
LINQ lambda ifadesi
input.Where(family=> family.parents[0].familyName == "Wakefield");
NoSQL
SELECT * FROM Families f WHERE f.parents[0].familyName = "Wakefield"
Where işleci, örnek 2:
LINQ lambda ifadesi
input.Where( family => family.parents[0].familyName == "Wakefield" && family.children[0].grade < 3);
NoSQL
SELECT * FROM Families f WHERE f.parents[0].familyName = "Wakefield" AND f.children[0].grade < 3
Bileşik NoSQL sorguları
Daha güçlü sorgular oluşturmak için önceki işleçleri oluşturabilirsiniz. Azure Cosmos DB iç içe kapsayıcıları desteklediğinden, bileşimi birleştirebilir veya iç içe yerleştirebilirsiniz.
Bitiştirme
Söz dizimi input(.|.SelectMany())(.Select()|.Where())*
şeklindedir. Birleştirilmiş sorgu isteğe bağlı SelectMany
bir sorguyla başlayabilir ve ardından birden çok Select
veya Where
işleç gelebilir.
Birleştirme, örnek 1:
LINQ lambda ifadesi
input.Select(family => family.parents[0]) .Where(parent => parent.familyName == "Wakefield");
NoSQL
SELECT * FROM Families f WHERE f.parents[0].familyName = "Wakefield"
Birleştirme, örnek 2:
LINQ lambda ifadesi
input.Where(family => family.children[0].grade > 3) .Select(family => family.parents[0].familyName);
NoSQL
SELECT VALUE f.parents[0].familyName FROM Families f WHERE f.children[0].grade > 3
Birleştirme, örnek 3:
LINQ lambda ifadesi
input.Select(family => new { grade=family.children[0].grade}). Where(anon=> anon.grade < 3);
NoSQL
SELECT * FROM Families f WHERE ({grade: f.children[0].grade}.grade > 3)
Birleştirme, örnek 4:
LINQ lambda ifadesi
input.SelectMany(family => family.parents) .Where(parent => parents.familyName == "Wakefield");
NoSQL
SELECT * FROM p IN Families.parents WHERE p.familyName = "Wakefield"
Iç içe
Söz dizimi , veya işlecinin olduğu yerdirinput.SelectMany(x=>x.Q())
.Q
Select
SelectMany
Where
İç içe yerleştirilmiş sorgu, iç sorguyu dış kapsayıcının her öğesine uygular. Önemli bir özellik, iç sorgunun kendi kendine birleştirme gibi dış kapsayıcıdaki öğelerin alanlarına başvurabilmesidir.
İç içe yerleştirme, örnek 1:
LINQ lambda ifadesi
input.SelectMany(family=> family.parents.Select(p => p.familyName));
NoSQL
SELECT VALUE p.familyName FROM Families f JOIN p IN f.parents
İç içe yerleştirme, örnek 2:
LINQ lambda ifadesi
input.SelectMany(family => family.children.Where(child => child.familyName == "Jeff"));
NoSQL
SELECT * FROM Families f JOIN c IN f.children WHERE c.familyName = "Jeff"
İç içe yerleştirme, örnek 3:
LINQ lambda ifadesi
input.SelectMany(family => family.children.Where( child => child.familyName == family.parents[0].familyName));
NoSQL
SELECT * FROM Families f JOIN c IN f.children WHERE c.familyName = f.parents[0].familyName
İlgili içerik
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin