LINQ till NoSQL-översättning i Azure Cosmos DB för NoSQL
GÄLLER FÖR: NoSQL
Azure Cosmos DB-frågeprovidern utför en bästa möjliga mappning från en LINQ-fråga till en Azure Cosmos DB för NoSQL-fråga. Om du vill hämta NoSQL-frågan som översätts från LINQ använder du ToString()
metoden för det genererade IQueryable
objektet. Följande beskrivning förutsätter grundläggande kunskaper om LINQ. Utöver LINQ stöder Azure Cosmos DB även Entity Framework Core, som fungerar med API för NoSQL.
Kommentar
Vi rekommenderar att du använder den senaste .NET SDK-versionen (Microsoft.Azure.Cosmos
)
Frågeproviderns typsystem stöder endast de primitiva JSON-typerna: numeric
, Boolean
, string
och null
.
Frågeprovidern stöder följande skaläruttryck:
Konstanta värden, inklusive konstanta värden för de primitiva datatyperna vid frågeutvärderingen.
Egenskaps-/matrisindexuttryck som refererar till egenskapen för ett objekt eller ett matriselement. Till exempel:
family.Id; family.children[0].familyName; family.children[0].grade;
int n = 1; family.children[n].grade;
Aritmetiska uttryck, inklusive vanliga aritmetiska uttryck för numeriska och booleska värden.
2 * family.children[0].grade; x + y;
Strängjämförelseuttryck, som inkluderar att jämföra ett strängvärde med ett konstant strängvärde.
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);
Uttryck för skapande av objekt/matris, som returnerar ett objekt av sammansatt värdetyp eller anonym typ, eller en matris med sådana objekt. Du kan kapsla dessa värden.
new Parent { familyName = "Wakefield", givenName = "Robin" }; new { first = 1, second = 2 }; //an anonymous type with two fields new int[] { 3, child.grade, 5 };
Använda LINQ
Du kan skapa en LINQ-fråga med GetItemLinqQueryable
. Det här exemplet visar LINQ-frågegenerering och asynkron körning med en 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);
}
}
LINQ-operatorer som stöds
LINQ-providern som ingår i NoSQL .NET SDK stöder följande operatorer:
- Välj: Projektioner översätts till SELECT, inklusive objektkonstruktion.
- Var: Filter översätts till WHERE och stöder översättning mellan
&&
,||
och!
till NoSQL-operatorerna - SelectMany: Tillåter avspolning av matriser till JOIN-satsen . Använd för att kedja eller kapsla uttryck för att filtrera på matriselement.
- OrderBy och OrderByDescending: Översätt till ORDER BY med ASC eller DESC.
- Operatorerna Count, Sum, Min, Max och Average för sammansättning och deras async-motsvarigheter CountAsync, SumAsync, MinAsync, MaxAsync och AverageAsync.
- CompareTo: Översätts till intervalljämförelser. Den här operatorn används ofta för strängar eftersom de inte är jämförbara i .NET.
- Hoppa över och ta: Översätts till OFFSET och LIMIT för att begränsa resultat från en fråga och göra sidnumrering.
- Matematiska funktioner: Stöder översättning från .NET
Abs
,Acos
,Asin
,Atan
,Ceiling
,Cos
, ,Exp
Floor
,Log
,Log10
,Round
Pow
Sign
,Sin
,Sqrt
,Tan
ochTruncate
till motsvarande inbyggda matematiska funktioner. - Strängfunktioner: Stöder översättning från .NET
Concat
,Contains
,Count
,EndsWith
,IndexOf
,Replace
,Reverse
,StartsWith
,SubString
,ToLower
, ,ToUpper
,TrimEnd
ochTrimStart
till motsvarande inbyggda strängfunktioner. - Matrisfunktioner: Stöder översättning från .NET
Concat
,Contains
ochCount
till motsvarande inbyggda matrisfunktioner. - Geospatiala tilläggsfunktioner: Stöder översättning från stub-metoder
Distance
,IsValid
,IsValidDetailed
ochWithin
till motsvarande inbyggda geospatiala funktioner. - Funktionstillägg för användardefinierad funktion: Stöder översättning från stub-metoden CosmosLinq.InvokeUserDefinedFunction till motsvarande användardefinierade funktion.
- Övrigt: Stöder översättning av
Coalesce
och villkorsstyrda operatorer. Kan översättasContains
till String CONTAINS, ARRAY_CONTAINS eller IN, beroende på kontext.
Exempel
Följande exempel illustrerar hur några av linq-standardfrågeoperatorerna översätts till frågor i Azure Cosmos DB.
Välj operator
Syntaxen är input.Select(x => f(x))
, där f
är ett skalärt uttryck. , input
i det här fallet, skulle vara ett IQueryable
objekt.
Välj operator, exempel 1:
LINQ-lambdauttryck
input.Select(family => family.parents[0].familyName);
NoSQL
SELECT VALUE f.parents[0].familyName FROM Families f
Välj operator, exempel 2:
LINQ-lambdauttryck
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älj operator, exempel 3:
LINQ-lambdauttryck
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
Operatorn SelectMany
Syntaxen är input.SelectMany(x => f(x))
, där f
är ett skalärt uttryck som returnerar en containertyp.
LINQ-lambdauttryck
input.SelectMany(family => family.children);
NoSQL
SELECT VALUE child FROM child IN Families.children
Operatorn Where
Syntaxen är input.Where(x => f(x))
, där f
är ett skalärt uttryck som returnerar ett booleskt värde.
Där operator, exempel 1:
LINQ-lambdauttryck
input.Where(family=> family.parents[0].familyName == "Wakefield");
NoSQL
SELECT * FROM Families f WHERE f.parents[0].familyName = "Wakefield"
Där operator, exempel 2:
LINQ-lambdauttryck
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
Sammansatta NoSQL-frågor
Du kan skapa de föregående operatorerna för att skapa mer kraftfulla frågor. Eftersom Azure Cosmos DB stöder kapslade containrar kan du sammanfoga eller kapsla kompositionen.
Sammanfogning
Syntax: input(.|.SelectMany())(.Select()|.Where())*
. En sammanlänkad fråga kan börja med en valfri SelectMany
fråga följt av flera Select
eller Where
operatorer.
Sammanfogning, exempel 1:
LINQ-lambdauttryck
input.Select(family => family.parents[0]) .Where(parent => parent.familyName == "Wakefield");
NoSQL
SELECT * FROM Families f WHERE f.parents[0].familyName = "Wakefield"
Sammanfogning, exempel 2:
LINQ-lambdauttryck
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
Sammanfogning, exempel 3:
LINQ-lambdauttryck
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)
Sammanfogning, exempel 4:
LINQ-lambdauttryck
input.SelectMany(family => family.parents) .Where(parent => parents.familyName == "Wakefield");
NoSQL
SELECT * FROM p IN Families.parents WHERE p.familyName = "Wakefield"
Kapsling
Syntaxen är input.SelectMany(x=>x.Q())
där Q
är en Select
operator , SelectMany
eller Where
.
En kapslad fråga tillämpar den inre frågan på varje element i den yttre containern. En viktig funktion är att den inre frågan kan referera till fälten för elementen i den yttre containern, till exempel en självkoppling.
Kapsling, exempel 1:
LINQ-lambdauttryck
input.SelectMany(family=> family.parents.Select(p => p.familyName));
NoSQL
SELECT VALUE p.familyName FROM Families f JOIN p IN f.parents
Kapsling, exempel 2:
LINQ-lambdauttryck
input.SelectMany(family => family.children.Where(child => child.familyName == "Jeff"));
NoSQL
SELECT * FROM Families f JOIN c IN f.children WHERE c.familyName = "Jeff"
Kapsling, exempel 3:
LINQ-lambdauttryck
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