Sdílet prostřednictvím


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, stringa 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í GetItemLinqQueryablepříkazu . Tento příklad ukazuje generování dotazů LINQ a asynchronní spouštění pomocí FeedIteratorpří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, , AsinAcosCeilingAtan, Cos, Exp, , LogLog10PowSignRoundFloorSinSqrta TruncateTanekvivalentní předdefinované matematické funkce.
  • Řetězcové funkce: Podporuje překlad z .NET Concat, , Contains, Count, EndsWith, ReplaceIndexOf, Reverse, SubStringStartsWith, ToLower, , TrimEndToUppera TrimStart ekvivalentní předdefinované řetězcové funkce.
  • Maticové funkce: Podporuje překlad z .NET Concat, Containsa Count ekvivalentní předdefinované maticové funkce.
  • Funkce geoprostorového rozšíření: Podporuje překlad z metod zástupných procedurDistance , IsValidIsValidDetailed, a Within 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žit Contains 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 inputtomto 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, SelectManynebo 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