Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A Cosmos DB (az Azure-ban és a Fabricben) lekérdezésszolgáltató a nyelvvel integrált lekérdezéseket (LINQ) NoSQL-lekérdezésekre fordítja le a hatékony adatlekérés érdekében. Ez a cikk ismerteti, hogy mely LINQ-operátorok támogatottak, és hogyan képezhetők le a LINQ-lekérdezések a Cosmos DB szintaxisára, segítve a .NET-fejlesztőket az adatbázis-lekérdezések optimalizálásában. Ha meg szeretné tekinteni a lefordított NoSQL-lekérdezést a LINQ-kódból, használja a metódust ToString() a létrehozott IQueryable objektumon. Az alábbi leírás feltételezi a LINQ alapszintű ismeretét. A LINQ mellett a Cosmos DB az Entity Framework Core-t is támogatja, amely a NoSQL-hez készült API-val működik.
Megjegyzés:
Javasoljuk, hogy a legújabb .NET SDK-verziótMicrosoft.Azure.Cosmos használja
A lekérdezésszolgáltató típusrendszere csak a JSON primitív típusokat támogatja: numeric, Boolean, stringés null.
A lekérdezésszolgáltató a következő skaláris kifejezéseket támogatja:
Állandó értékek, beleértve a primitív adattípusok állandó értékeit a lekérdezések kiértékelésének idején.
Tulajdonság-/tömbindex-kifejezések, amelyek egy objektum vagy tömbelem tulajdonságára hivatkoznak. Például:
family.Id; family.children[0].familyName; family.children[0].grade;int n = 1; family.children[n].grade;Számtani kifejezések, beleértve a numerikus és logikai értékek gyakori aritmetikai kifejezéseit.
2 * family.children[0].grade; x + y;Sztring-összehasonlító kifejezések, amelyek magukban foglalják a sztringértékek egy állandó sztringértékhez való összehasonlítását.
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);Objektum-/tömblétrehozó kifejezések, amelyek összetett vagy névtelen típusú objektumot vagy ilyen objektumok tömböt adnak vissza. Ezeket az értékeket beágyazhatja.
new Parent { familyName = "Wakefield", givenName = "Robin" }; new { first = 1, second = 2 }; //an anonymous type with two fields new int[] { 3, child.grade, 5 };
A LINQ használata
LINQ-lekérdezést GetItemLinqQueryablea . Ez a példa a LINQ-lekérdezések létrehozását és aszinkron végrehajtását mutatja be a következővel 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);
}
}
Támogatott LINQ-operátorok
A NoSQL .NET SDK-hez tartozó LINQ-szolgáltató a következő operátorokat támogatja:
-
Válassza ki a következőt: A vetítések lefordítva
SELECT, beleértve az objektumszerkezetet is. -
Hol: A szűrők lefordítják
WHEREés támogatják a noSQL-operátorok közötti fordítást, és!támogatják a fordítást a noSQL-operátorok között&&|| -
SelectMany: Lehetővé teszi a tömbök visszatekerését a
JOINzáradékhoz. Kifejezéseket láncra vagy beágyazásra használ a tömbelemekre való szűréshez. -
OrderBy és OrderByDescending: Fordítás
ORDER BYa következővelASCvagyDESC. - Count, Sum, Min, Max és Average operátorok az aggregációhoz, és ezek aszinkron megfelelői a CountAsync, a SumAsync, a MinAsync, a MaxAsync és az AverageAsync.
- Összehasonlítás: Tartomány-összehasonlításokra fordítja le. Ezt az operátort gyakran használják sztringekhez, mivel a .NET-ben nem hasonlíthatók össze.
-
Kihagyás és lekérés: Lefordítja a
OFFSETlekérdezés eredményeinek korlátozására ésLIMITa lapozásra. -
Matematikai függvények: Támogatja a fordítást .NET
Abs,Acos, ,Asin,CeilingAtan,CosExp,Log10FloorSignRoundLogSqrtSinPow,TanésTruncateaz azzal egyenértékű beépített matematikai függvények. -
Sztringfüggvények: Támogatja a fordítást a .NET
Concat,Contains, ,EndsWithCount,IndexOf,ReplaceReverse,StartsWithSubString,ToLower,TrimEndToUpperTrimStart, és az azzal egyenértékű beépített sztringfüggvények között. -
Tömbfüggvények: Támogatja a fordítást a .NET-ből
ConcatContainsésCountaz azzal egyenértékű beépített tömbfüggvényekbe. -
Térinformatikai bővítményfüggvények: Támogatja a fordítást csonkmetódusokból
Distance,IsValidIsValidDetailedésWithinaz azzal egyenértékű beépített térinformatikai függvényekből. -
User-Defined Függvénybővítmény függvény: Támogatja a stub metódusból
CosmosLinq.InvokeUserDefinedFunctiona megfelelő felhasználó által definiált függvényre való fordítást. -
Egyéb: Támogatja a fordítást és a
Coalescefeltételes operátorokat. A szövegkörnyezettől függően sztringre vagyINsztringreARRAY_CONTAINSCONTAINSis lefordíthatóContains.
Példák
Az alábbi példák azt szemléltetik, hogy a standard LINQ-lekérdezési operátorok némelyike hogyan fordít le lekérdezéseket a Cosmos DB-ben.
Operátor kiválasztása
A szintaxis az input.Select(x => f(x)), ahol f skaláris kifejezés van. Ebben inputaz esetben egy IQueryable objektum lenne.
Operátor kiválasztása, 1. példa:
LINQ lambda kifejezés
input.Select(family => family.parents[0].familyName);NoSQL
SELECT VALUE f.parents[0].familyName FROM Families f
Válasszon operátort, 2. példa:
LINQ lambda kifejezés
input.Select(family => family.children[0].grade + c); // c is an int variableNoSQL
SELECT VALUE f.children[0].grade + c FROM Families f
Operátor kiválasztása, 3. példa:
LINQ lambda kifejezés
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 operátor
A szintaxis az input.SelectMany(x => f(x)), ahol f egy skaláris kifejezés, amely egy tárolótípust ad vissza.
LINQ lambda kifejezés
input.SelectMany(family => family.children);NoSQL
SELECT VALUE child FROM child IN Families.children
Ahol az operátor
A szintaxis az input.Where(x => f(x)), ahol f egy skaláris kifejezés, amely logikai értéket ad vissza.
Ahol az operátor, 1. példa:
LINQ lambda kifejezés
input.Where(family=> family.parents[0].familyName == "Wakefield");NoSQL
SELECT * FROM Families f WHERE f.parents[0].familyName = "Wakefield"
Ahol az operátor, 2. példa:
LINQ lambda kifejezés
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
Összetett NoSQL-lekérdezések
Az előző operátorok írásával hatékonyabb lekérdezéseket hozhat létre. Mivel a Cosmos DB támogatja a beágyazott tárolókat, összefűzheti vagy beágyazhatja a kompozíciót.
Összeláncolás
A szintaxis a következő: input(.|.SelectMany())(.Select()|.Where())*. Az összefűzött lekérdezések egy választható SelectMany lekérdezéssel kezdődhetnek, amelyet több Select vagy Where operátor követ.
Összefűzés, 1. példa:
LINQ lambda kifejezés
input.Select(family => family.parents[0]) .Where(parent => parent.familyName == "Wakefield");NoSQL
SELECT * FROM Families f WHERE f.parents[0].familyName = "Wakefield"
Összefűzés, 2. példa:
LINQ lambda kifejezés
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
Összefűzés, 3. példa:
LINQ lambda kifejezés
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)
Összefűzés, 4. példa:
LINQ lambda kifejezés
input.SelectMany(family => family.parents) .Where(parent => parents.familyName == "Wakefield");NoSQL
SELECT * FROM p IN Families.parents WHERE p.familyName = "Wakefield"
Fészkelő
A szintaxis az input.SelectMany(x=>x.Q())QSelect, SelectManyvagy Where operátor helye.
A beágyazott lekérdezés a belső lekérdezést a külső tároló minden elemére alkalmazza. Az egyik fontos funkció, hogy a belső lekérdezés hivatkozhat a külső tároló elemeinek mezőire, például egy öncsatlakozásra.
Beágyazás, 1. példa:
LINQ lambda kifejezés
input.SelectMany(family=> family.parents.Select(p => p.familyName));NoSQL
SELECT VALUE p.familyName FROM Families f JOIN p IN f.parents
Beágyazás, 2. példa:
LINQ lambda kifejezés
input.SelectMany(family => family.children.Where(child => child.familyName == "Jeff"));NoSQL
SELECT * FROM Families f JOIN c IN f.children WHERE c.familyName = "Jeff"
Beágyazás, 3. példa:
LINQ lambda kifejezés
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