Dela via


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, stringoch 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, , ExpFloor, Log, Log10, RoundPowSign, Sin, Sqrt, Tanoch Truncate 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, TrimEndoch TrimStart till motsvarande inbyggda strängfunktioner.
  • Matrisfunktioner: Stöder översättning från .NET Concat, Containsoch Count till motsvarande inbyggda matrisfunktioner.
  • Geospatiala tilläggsfunktioner: Stöder översättning från stub-metoder Distance, IsValid, IsValidDetailedoch Within 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ättas Contains 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. , inputi 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 Selectoperator , SelectManyeller 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