Bagikan melalui


Terjemahan LINQ ke NoSQL di Azure Cosmos DB untuk NoSQL

BERLAKU UNTUK: NoSQL

Penyedia kueri Azure Cosmos DB melakukan pemetaan upaya terbaik dari kueri LINQ ke dalam kueri Azure Cosmos DB untuk NoSQL. Jika Anda ingin mendapatkan kueri NoSQL yang diterjemahkan dari LINQ, gunakan ToString() metode pada objek yang dihasilkan IQueryable . Deskripsi berikut mengasumsikan keakraban dasar dengan LINQ. Selain LINQ, Azure Cosmos DB juga mendukung Entity Framework Core, yang berfungsi dengan API untuk NoSQL.

Catatan

Sebaiknya gunakan versi .NET SDK (Microsoft.Azure.Cosmos) terbaru

Sistem jenis penyedia kueri hanya mendukung jenis primitif JSON: numeric, , Booleanstring, dan null.

Penyedia kueri mendukung ekspresi skalar berikut:

  • Nilai konstanta, termasuk nilai konstan dari jenis data primitif pada waktu evaluasi kueri.

  • Ekspresi indeks properti/array yang merujuk ke properti objek atau elemen array. Contohnya:

    family.Id;
    family.children[0].familyName;
    family.children[0].grade;
    
    int n = 1;
    
    family.children[n].grade;
    
  • Ekspresi aritmetika, termasuk ekspresi aritmetika umum pada nilai numerik dan Boolean.

    2 * family.children[0].grade;
    x + y;
    
  • Ekspresi perbandingan string, yang mencakup membandingkan nilai string dengan beberapa nilai string konstan.

    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);
    
  • Ekspresi pembuatan objek/array, yang mengembalikan objek dengan jenis nilai majemuk atau jenis anonim, atau array objek tersebut. Anda dapat menumpuk nilai-nilai ini.

    new Parent { familyName = "Wakefield", givenName = "Robin" };
    new { first = 1, second = 2 }; //an anonymous type with two fields  
    new int[] { 3, child.grade, 5 };
    

Menggunakan LINQ

Anda dapat membuat kueri LINQ dengan GetItemLinqQueryable . Contoh ini menunjukkan pembuatan kueri LINQ dan eksekusi asinkron dengan 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);
    }
}

Operator LINQ yang didukung

Penyedia LINQ yang disertakan dengan NoSQL .NET SDK mendukung operator berikut:

  • Pilih: Proyeksi diterjemahkan ke SELECT, termasuk konstruksi objek.
  • Di mana: Filter diterjemahkan ke WHERE, dan mendukung terjemahan antara &&, ||, dan ! ke operator NoSQL
  • SelectMany: Memungkinkan melepas penat dari array ke klausa JOIN. Gunakan untuk merantai atau menumpuk ekspresi untuk memfilter pada elemen array.
  • OrderBy dan OrderByDescending: Terjemahkan ke ORDER BY dengan ASC atau DESC.
  • Operator Count, Sum, Min, Max, dan Average untuk agregasi, dan asinkron yang setara dengan CountAsync, SumAsync, MinAsync, MaxAsync, dan AverageAsync.
  • CompareTo: Diterjemahkan ke perbandingan rentang. Operator ini biasanya digunakan untuk string, karena tidak sebanding di .NET.
  • Lewati dan Ambil: Terjemahkan ke OFFSET dan LIMIT untuk membatasi hasil dari kueri dan melakukan pagination.
  • Fungsi matematika: Mendukung terjemahan dari .NETAbs, Acos, Asin, Atan, Ceiling, Cos, Exp, Floor, Log, Log10, Pow, Round, Sign, Sin, Sqrt, Tan, dan Truncate ke fungsi matematika bawaan yang setara.
  • Fungsi string: Mendukung terjemahan dari .NET,Concat, Contains, Count, EndsWith,IndexOf, Replace, Reverse, StartsWith, SubString, ToLower, ToUpper, TrimEnd, dan TrimStart ke fungsi string bawaan yang setara.
  • Fungsi array: Mendukung terjemahan dari .NET, Concat , dan ke fungsi array bawaan yang ContainsCountsetara.
  • Fungsi Ekstensi Geospasi: Mendukung terjemahan dari metode rintisan Distance, IsValid, IsValidDetailed, dan ke fungsi Withingeospasi bawaan yang setara.
  • Fungsi Ekstensi Fungsi yang Ditentukan Pengguna: Mendukung terjemahan dari metode stub CosmosLinq.InvokeUserDefinedFunction ke fungsi yang ditentukan pengguna yang sesuai.
  • Lain-lain: Mendukung terjemahan Coalesce dan operator bersyarat. Dapat menerjemahkan Contains ke String CONTAINS, ARRAY_CONTAINS, atau IN, bergantung pada konteksnya.

Contoh

Contoh berikut menggambarkan bagaimana beberapa operator kueri LINQ standar diterjemahkan ke kueri di Azure Cosmos DB.

Pilih operator

Sintaksnya adalah input.Select(x => f(x)), di mana ekspresi f skalar. input, dalam hal ini, akan menjadi objek IQueryable.

Pilih operator, contoh 1:

  • Ekspresi lambda LINQ

    input.Select(family => family.parents[0].familyName);
    
  • NoSQL

    SELECT VALUE f.parents[0].familyName
    FROM Families f
    

Pilih operator, contoh 2:

  • Ekspresi 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
    

Pilih operator, contoh 3:

  • Ekspresi 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
    

Operator SelectMany

Sintaksnya adalah input.SelectMany(x => f(x)), di mana ekspresi f skalar yang mengembalikan jenis kontainer.

  • Ekspresi lambda LINQ

    input.SelectMany(family => family.children);
    
  • NoSQL

    SELECT VALUE child
    FROM child IN Families.children
    

Di mana operator

Sintaksnya adalah input.Where(x => f(x)), di mana ekspresi f skalar, yang mengembalikan nilai Boolean.

Di mana operator, contoh 1:

  • Ekspresi lambda LINQ

    input.Where(family=> family.parents[0].familyName == "Wakefield");
    
  • NoSQL

    SELECT *
    FROM Families f
    WHERE f.parents[0].familyName = "Wakefield"
    

Di mana operator, contoh 2:

  • Ekspresi 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
    

Kueri NoSQL Komposit

Anda dapat menyusun operator sebelumnya untuk membentuk kueri yang lebih kuat. Karena Azure Cosmos DB mendukung kontainer berlapis, Anda dapat menggabungkan atau menyarangkan komposisi.

Rangkaian

Sintaksnya adalah input(.|.SelectMany())(.Select()|.Where())*. Kueri yang bergabung bisa dimulai dengan SelectMany kueri opsional, diikuti oleh beberapa Select atau Where operator.

Penggabungan, contoh 1:

  • Ekspresi lambda LINQ

    input.Select(family => family.parents[0])
        .Where(parent => parent.familyName == "Wakefield");
    
  • NoSQL

    SELECT *
    FROM Families f
    WHERE f.parents[0].familyName = "Wakefield"
    

Penggabungan, contoh 2:

  • Ekspresi 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
    

Penggabungan, contoh 3:

  • Ekspresi 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)
    

Penggabungan, contoh 4:

  • Ekspresi lambda LINQ

    input.SelectMany(family => family.parents)
        .Where(parent => parents.familyName == "Wakefield");
    
  • NoSQL

    SELECT *
    FROM p IN Families.parents
    WHERE p.familyName = "Wakefield"
    

Bersarang

Sintaksnya input.SelectMany(x=>x.Q()) di mana Q adalah Select, SelectMany, atau Where operator.

Kueri bertumpuk menerapkan kueri dalam untuk setiap elemen kontainer luar. Salah satu fitur penting adalah kueri dalam dapat merujuk ke bidang elemen di kontainer luar, seperti gabungan sendiri.

Bersarang, contoh 1:

  • Ekspresi lambda LINQ

    input.SelectMany(family=>
        family.parents.Select(p => p.familyName));
    
  • NoSQL

    SELECT VALUE p.familyName
    FROM Families f
    JOIN p IN f.parents
    

Bersarang, contoh 2:

  • Ekspresi 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"
    

Bersarang, contoh 3:

  • Ekspresi 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