Překlad LINQ to NoSQL ve službě Azure Cosmos DB for NoSQL
PLATÍ PRO: NoSQL
Zprostředkovatel dotazů Azure Cosmos DB provádí mapování dotazu LINQ z dotazu LINQ na dotaz Azure Cosmos DB for NoSQL. Pokud chcete získat dotaz NoSQL přeložený z LINQ, použijte ToString()
metodu pro vygenerovaný IQueryable
objekt. Následující popis předpokládá základní znalost LINQ. Kromě LINQ podporuje Služba Azure Cosmos DB také Entity Framework Core, která funguje s rozhraním API pro NoSQL.
Poznámka:
Doporučujeme použít nejnovější verzi sady .NET SDK (Microsoft.Azure.Cosmos
).
Systém typů zprostředkovatele dotazů podporuje pouze primitivní typy JSON: numeric
, Boolean
, string
a null
.
Zprostředkovatel dotazů podporuje následující skalární výrazy:
Konstantní hodnoty, včetně konstantních hodnot primitivních datových typů v době vyhodnocení dotazu.
Výrazy indexu vlastností/pole, které odkazují na vlastnost objektu nebo prvku pole. Příklad:
family.Id; family.children[0].familyName; family.children[0].grade;
int n = 1; family.children[n].grade;
Aritmetické výrazy, včetně běžných aritmetických výrazů u číselných a logických hodnot.
2 * family.children[0].grade; x + y;
Řetězcové porovnávací výrazy, mezi které patří porovnání řetězcové hodnoty s určitou konstantní řetězcovou hodnotou.
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);
Výrazy pro vytváření objektů/polí, které vrací objekt složeného typu hodnoty nebo anonymního typu, nebo pole takových objektů. Tyto hodnoty můžete vnořit.
new Parent { familyName = "Wakefield", givenName = "Robin" }; new { first = 1, second = 2 }; //an anonymous type with two fields new int[] { 3, child.grade, 5 };
Použití LINQ
Dotaz LINQ můžete vytvořit pomocí GetItemLinqQueryable
příkazu . Tento příklad ukazuje generování dotazů LINQ a asynchronní spouštění pomocí FeedIterator
příkazu :
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);
}
}
Podporované operátory LINQ
Zprostředkovatel LINQ, který je součástí sady .NET SDK NoSQL, podporuje následující operátory:
- Select: Projekce se překládají na SELECT, včetně konstrukce objektů.
- Kde: Filtry se překládají na WHERE a podporují překlad mezi
&&
||
operátory NoSQL a!
noSQL. - SelectMany: Umožňuje odvíjení polí do klauzule JOIN . Slouží k zřetězování nebo vnoření výrazů k filtrování prvků pole.
- OrderBy a OrderByDescending: Přeloží na ORDER BY pomocí ASC nebo DESC.
- Operátory Count, Sum, Min, Max a Average pro agregaci a jejich asynchronní ekvivalenty CountAsync, SumAsync, MinAsync, MaxAsync a AverageAsync.
- CompareTo: Překládá do porovnání rozsahů. Tento operátor se běžně používá pro řetězce, protože nejsou srovnatelné v .NET.
- Přeskočit a vzít: Přeloží se na POSUN a LIMIT pro omezení výsledků dotazu a provádění stránkování.
- Matematické funkce: Podporuje překlad z .NET
Abs
, ,Asin
Acos
Ceiling
Atan
,Cos
,Exp
, ,Log
Log10
Pow
Sign
Round
Floor
Sin
Sqrt
aTruncate
Tan
ekvivalentní předdefinované matematické funkce. - Řetězcové funkce: Podporuje překlad z .NET
Concat
, ,Contains
,Count
,EndsWith
,Replace
IndexOf
,Reverse
,SubString
StartsWith
,ToLower
, ,TrimEnd
ToUpper
aTrimStart
ekvivalentní předdefinované řetězcové funkce. - Maticové funkce: Podporuje překlad z .NET
Concat
,Contains
aCount
ekvivalentní předdefinované maticové funkce. - Funkce geoprostorového rozšíření: Podporuje překlad z metod zástupných procedur
Distance
,IsValid
IsValidDetailed
, aWithin
ekvivalentních předdefinovaných geoprostorových funkcí. - Funkce Rozšíření uživatelem definované funkce: Podporuje překlad z metody zástupných procedur CosmosLinq.InvokeUserDefinedFunction na odpovídající uživatelem definovanou funkci.
- Různé: Podporuje překlad
Coalesce
a podmíněné operátory. V závislosti na kontextu se dá přeložitContains
na řetězec CONTAINS, ARRAY_CONTAINS nebo IN.
Příklady
Následující příklady ukazují, jak některé standardní operátory dotazů LINQ překládají na dotazy ve službě Azure Cosmos DB.
Vyberte operátor.
Syntaxe je input.Select(x => f(x))
, kde f
je skalární výraz. V input
tomto případě by to byl IQueryable
objekt.
Výběr operátoru, příklad 1:
Výraz lambda LINQ
input.Select(family => family.parents[0].familyName);
NoSQL
SELECT VALUE f.parents[0].familyName FROM Families f
Výběr operátoru, příklad 2:
Výraz 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
Výběr operátoru, příklad 3:
Výraz 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
Operátor SelectMany
Syntaxe je , kde f
je input.SelectMany(x => f(x))
skalární výraz, který vrací typ kontejneru.
Výraz lambda LINQ
input.SelectMany(family => family.children);
NoSQL
SELECT VALUE child FROM child IN Families.children
Operátor Where
Syntaxe je , kde f
je input.Where(x => f(x))
skalární výraz, který vrací logickou hodnotu.
Operátor Where, příklad 1:
Výraz lambda LINQ
input.Where(family=> family.parents[0].familyName == "Wakefield");
NoSQL
SELECT * FROM Families f WHERE f.parents[0].familyName = "Wakefield"
Operátor Where, příklad 2:
Výraz 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
Složené dotazy NoSQL
Předchozí operátory můžete vytvořit tak, aby se vytvořily výkonnější dotazy. Vzhledem k tomu, že Azure Cosmos DB podporuje vnořené kontejnery, můžete zřetězení nebo vnoření složení.
Zřetězení
Syntaxe je input(.|.SelectMany())(.Select()|.Where())*
. Zřetězený dotaz může začínat volitelným SelectMany
dotazem následovaným více Select
operátory nebo Where
operátory.
Zřetězení, příklad 1:
Výraz lambda LINQ
input.Select(family => family.parents[0]) .Where(parent => parent.familyName == "Wakefield");
NoSQL
SELECT * FROM Families f WHERE f.parents[0].familyName = "Wakefield"
Zřetězení, příklad 2:
Výraz 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
Zřetězení, příklad 3:
Výraz 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)
Zřetězení, příklad 4:
Výraz lambda LINQ
input.SelectMany(family => family.parents) .Where(parent => parents.familyName == "Wakefield");
NoSQL
SELECT * FROM p IN Families.parents WHERE p.familyName = "Wakefield"
Hnízdění
Syntaxe je kde Q
je input.SelectMany(x=>x.Q())
operátor Select
, SelectMany
nebo Where
.
Vnořený dotaz použije vnitřní dotaz na každý prvek vnějšího kontejneru. Jednou z důležitých funkcí je, že vnitřní dotaz může odkazovat na pole prvků ve vnějším kontejneru, jako je vlastní spojení.
Vnoření, příklad 1:
Výraz lambda LINQ
input.SelectMany(family=> family.parents.Select(p => p.familyName));
NoSQL
SELECT VALUE p.familyName FROM Families f JOIN p IN f.parents
Vnoření, příklad 2:
Výraz 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"
Vnoření, příklad 3:
Výraz 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