Megosztás a következőn keresztül:


LINQ–NoSQL-fordítás az Azure Cosmos DB for NoSQL-ben

A KÖVETKEZŐRE VONATKOZIK: NoSQL

Az Azure Cosmos DB lekérdezésszolgáltatója a LINQ-lekérdezésekből a lehető legjobban megfeleltet egy Azure Cosmos DB for NoSQL-lekérdezésbe. Ha le szeretné kérdezni a LINQ-ból lefordított NoSQL-lekérdezést, használja a ToString() metódust a létrehozott IQueryable objektumon. Az alábbi leírás feltételezi a LINQ alapszintű ismeretét. Az Azure Cosmos DB a LINQ mellett az Entity Framework Core-t is támogatja, amely a NoSQL-hez készült API-val működik.

Feljegyzé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élda:

    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:

  • Kiválasztás: A vetítések SELECT-re fordítása, beleértve az objektumépítést is.
  • Hol: A szűrők lefordítják a WHERE-t, és támogatják a fordítást a , ||és ! a NoSQL-operátorok között &&
  • SelectMany: Lehetővé teszi a tömbök illesztését a JOIN záradékhoz. Kifejezéseket láncra vagy beágyazásra használ a tömbelemekre való szűréshez.
  • OrderBy és OrderByDescending: Translate to ORDER BY with ASC vagy DESC.
  • 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 levétel: AZ ELTOLÁS és a LIMIT értékre fordítása a lekérdezés eredményeinek korlátozásához és a lapozáshoz.
  • Matematikai függvények: Támogatja a fordítást .NETAbs, Acos, , Asin, AtanCeiling, ExpCos, Log10PowLogFloorSqrtRoundSignSin, Tanés Truncate az azzal egyenértékű beépített matematikai függvények.
  • Sztringfüggvények: Támogatja a fordítást a .NETConcat, Contains, , CountEndsWith,IndexOf, ReplaceReverse, SubStringStartsWith, ToLower, TrimEndTrimStart ToUpper, é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és Count az 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ólDistance, IsValidIsValidDetailedés Within az azzal egyenértékű beépített térinformatikai függvényekből.
  • Felhasználó által definiált függvénykiterjesztési függvény: Támogatja a CosmosLinq.InvokeUserDefinedFunction metódusból a megfelelő felhasználó által definiált függvényre történő fordítást.
  • Egyéb: Támogatja a fordítást és a Coalesce feltételes operátorokat. A kontextustól függően lefordítható Contains a STRING CONTAINS, ARRAY_CONTAINS vagy IN kifejezésre.

Példák

Az alábbi példák azt szemléltetik, hogy a szabványos LINQ-lekérdezési operátorok némelyike hogyan fordít le lekérdezésekre az Azure 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 variable
    
  • NoSQL

    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 az Azure 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()) Q Select, 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