Terjemahan LINQ ke NoSQL di Azure Cosmos DB untuk NoSQL
BERLAKU UNTUK: NoSQL
Penyedia kueri Azure Cosmos DB melakukan pemetaan upaya terbaik dari kueri LINQ ke dalam kueri Azure Cosmos DB untuk NoSQL. Jika Anda ingin mendapatkan kueri NoSQL yang diterjemahkan dari LINQ, gunakan ToString()
metode pada objek yang dihasilkan IQueryable
. Deskripsi berikut mengasumsikan keakraban dasar dengan LINQ. Selain LINQ, Azure Cosmos DB juga mendukung Entity Framework Core, yang berfungsi dengan API untuk NoSQL.
Sistem jenis penyedia kueri hanya mendukung jenis primitif JSON: numeric
, , Boolean
string
, dan null
.
Penyedia kueri mendukung ekspresi skalar berikut:
Nilai konstanta, termasuk nilai konstan dari jenis data primitif pada waktu evaluasi kueri.
Ekspresi indeks properti/array yang merujuk ke properti objek atau elemen array. Contohnya:
family.Id; family.children[0].familyName; family.children[0].grade;
int n = 1; family.children[n].grade;
Ekspresi aritmetika, termasuk ekspresi aritmetika umum pada nilai numerik dan Boolean.
2 * family.children[0].grade; x + y;
Ekspresi perbandingan string, yang mencakup membandingkan nilai string dengan beberapa nilai string konstan.
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);
Ekspresi pembuatan objek/array, yang mengembalikan objek dengan jenis nilai majemuk atau jenis anonim, atau array objek tersebut. Anda dapat menumpuk nilai-nilai ini.
new Parent { familyName = "Wakefield", givenName = "Robin" }; new { first = 1, second = 2 }; //an anonymous type with two fields new int[] { 3, child.grade, 5 };
Menggunakan LINQ
Anda dapat membuat kueri LINQ dengan GetItemLinqQueryable
. Contoh ini menunjukkan pembuatan kueri LINQ dan eksekusi asinkron dengan 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);
}
}
Operator LINQ yang didukung
Penyedia LINQ yang disertakan dengan NoSQL .NET SDK mendukung operator berikut:
- Pilih: Proyeksi diterjemahkan ke SELECT, termasuk konstruksi objek.
- Di mana: Filter diterjemahkan ke WHERE, dan mendukung terjemahan antara
&&
,||
, dan!
ke operator NoSQL - SelectMany: Memungkinkan melepas penat dari array ke klausa JOIN. Gunakan untuk merantai atau menumpuk ekspresi untuk memfilter pada elemen array.
- OrderBy dan OrderByDescending: Terjemahkan ke ORDER BY dengan ASC atau DESC.
- Operator Count, Sum, Min, Max, dan Average untuk agregasi, dan asinkron yang setara dengan CountAsync, SumAsync, MinAsync, MaxAsync, dan AverageAsync.
- CompareTo: Diterjemahkan ke perbandingan rentang. Operator ini biasanya digunakan untuk string, karena tidak sebanding di .NET.
- Lewati dan Ambil: Terjemahkan ke OFFSET dan LIMIT untuk membatasi hasil dari kueri dan melakukan pagination.
- Fungsi matematika: Mendukung terjemahan dari .NET
Abs
,Acos
,Asin
,Atan
,Ceiling
,Cos
,Exp
,Floor
,Log
,Log10
,Pow
,Round
,Sign
,Sin
,Sqrt
,Tan
, danTruncate
ke fungsi matematika bawaan yang setara. - Fungsi string: Mendukung terjemahan dari .NET,
Concat
,Contains
,Count
,EndsWith
,IndexOf
,Replace
,Reverse
,StartsWith
,SubString
,ToLower
,ToUpper
,TrimEnd
, danTrimStart
ke fungsi string bawaan yang setara. - Fungsi array: Mendukung terjemahan dari .NET,
Concat
, dan ke fungsi array bawaan yangContains
Count
setara. - Fungsi Ekstensi Geospasi: Mendukung terjemahan dari metode rintisan
Distance
,IsValid
,IsValidDetailed
, dan ke fungsiWithin
geospasi bawaan yang setara. - Fungsi Ekstensi Fungsi yang Ditentukan Pengguna: Mendukung terjemahan dari metode stub CosmosLinq.InvokeUserDefinedFunction ke fungsi yang ditentukan pengguna yang sesuai.
- Lain-lain: Mendukung terjemahan
Coalesce
dan operator bersyarat. Dapat menerjemahkanContains
ke String CONTAINS, ARRAY_CONTAINS, atau IN, bergantung pada konteksnya.
Contoh
Contoh berikut menggambarkan bagaimana beberapa operator kueri LINQ standar diterjemahkan ke kueri di Azure Cosmos DB.
Pilih operator
Sintaksnya adalah input.Select(x => f(x))
, di mana ekspresi f
skalar. input
, dalam hal ini, akan menjadi objek IQueryable
.
Pilih operator, contoh 1:
Ekspresi lambda LINQ
input.Select(family => family.parents[0].familyName);
NoSQL
SELECT VALUE f.parents[0].familyName FROM Families f
Pilih operator, contoh 2:
Ekspresi lambda LINQ
input.Select(family => family.children[0].grade + c); // c is an int variable
NoSQL
SELECT VALUE f.children[0].grade + c FROM Families f
Pilih operator, contoh 3:
Ekspresi lambda LINQ
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
Operator SelectMany
Sintaksnya adalah input.SelectMany(x => f(x))
, di mana ekspresi f
skalar yang mengembalikan jenis kontainer.
Ekspresi lambda LINQ
input.SelectMany(family => family.children);
NoSQL
SELECT VALUE child FROM child IN Families.children
Di mana operator
Sintaksnya adalah input.Where(x => f(x))
, di mana ekspresi f
skalar, yang mengembalikan nilai Boolean.
Di mana operator, contoh 1:
Ekspresi lambda LINQ
input.Where(family=> family.parents[0].familyName == "Wakefield");
NoSQL
SELECT * FROM Families f WHERE f.parents[0].familyName = "Wakefield"
Di mana operator, contoh 2:
Ekspresi lambda LINQ
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
Kueri NoSQL Komposit
Anda dapat menyusun operator sebelumnya untuk membentuk kueri yang lebih kuat. Karena Azure Cosmos DB mendukung kontainer berlapis, Anda dapat menggabungkan atau menyarangkan komposisi.
Rangkaian
Sintaksnya adalah input(.|.SelectMany())(.Select()|.Where())*
. Kueri yang bergabung bisa dimulai dengan SelectMany
kueri opsional, diikuti oleh beberapa Select
atau Where
operator.
Penggabungan, contoh 1:
Ekspresi lambda LINQ
input.Select(family => family.parents[0]) .Where(parent => parent.familyName == "Wakefield");
NoSQL
SELECT * FROM Families f WHERE f.parents[0].familyName = "Wakefield"
Penggabungan, contoh 2:
Ekspresi lambda LINQ
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
Penggabungan, contoh 3:
Ekspresi lambda LINQ
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)
Penggabungan, contoh 4:
Ekspresi lambda LINQ
input.SelectMany(family => family.parents) .Where(parent => parents.familyName == "Wakefield");
NoSQL
SELECT * FROM p IN Families.parents WHERE p.familyName = "Wakefield"
Bersarang
Sintaksnya input.SelectMany(x=>x.Q())
di mana Q
adalah Select
, SelectMany
, atau Where
operator.
Kueri bertumpuk menerapkan kueri dalam untuk setiap elemen kontainer luar. Salah satu fitur penting adalah kueri dalam dapat merujuk ke bidang elemen di kontainer luar, seperti gabungan sendiri.
Bersarang, contoh 1:
Ekspresi lambda LINQ
input.SelectMany(family=> family.parents.Select(p => p.familyName));
NoSQL
SELECT VALUE p.familyName FROM Families f JOIN p IN f.parents
Bersarang, contoh 2:
Ekspresi lambda LINQ
input.SelectMany(family => family.children.Where(child => child.familyName == "Jeff"));
NoSQL
SELECT * FROM Families f JOIN c IN f.children WHERE c.familyName = "Jeff"
Bersarang, contoh 3:
Ekspresi lambda LINQ
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