Aracılığıyla paylaş


NoSQL için Azure Cosmos DB'de LINQ to NoSQL çevirisi

UYGULANANLAR: NoSQL

Azure Cosmos DB sorgu sağlayıcısı, LINQ sorgusundan NoSQL için Azure Cosmos DB sorgusuna en iyi şekilde eşleme gerçekleştirir. LINQ'den çevrilen NoSQL sorgusunu almak istiyorsanız, oluşturulan IQueryable nesnede yöntemini kullanınToString(). Aşağıdaki açıklama LINQ ile ilgili temel bir bilgi olduğunu varsayar. LINQ'e ek olarak Azure Cosmos DB, NoSQL için API ile çalışan Entity Framework Core'ı da destekler.

Sorgu sağlayıcısı türü sistemi yalnızca JSON temel türlerini destekler: numeric, Boolean, stringve null.

Sorgu sağlayıcısı aşağıdaki skaler ifadeleri destekler:

  • Sorgu değerlendirme zamanında ilkel veri türlerinin sabit değerleri de dahil olmak üzere sabit değerler.

  • Bir nesnenin veya dizi öğesinin özelliğine başvuran özellik/dizi dizin ifadeleri. Örneğin:

    family.Id;
    family.children[0].familyName;
    family.children[0].grade;
    
    int n = 1;
    
    family.children[n].grade;
    
  • Sayısal ve Boole değerleri üzerindeki yaygın aritmetik ifadeler de dahil olmak üzere aritmetik ifadeler.

    2 * family.children[0].grade;
    x + y;
    
  • Bir dize değerini sabit bir dize değeriyle karşılaştırmayı içeren dize karşılaştırma ifadeleri.

    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);
    
  • Bileşik değer türünde veya anonim türde bir nesne ya da bu tür nesnelerin dizisini döndüren nesne/dizi oluşturma ifadeleri. Bu değerleri iç içe yerleştirebilirsiniz.

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

LINQ kullanma

ile GetItemLinqQueryablebir LINQ sorgusu oluşturabilirsiniz. Bu örnekte LINQ sorgu oluşturma ve ile zaman uyumsuz yürütme gösterilmektedir 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);
    }
}

Desteklenen LINQ işleçleri

NoSQL .NET SDK'sı ile birlikte gelen LINQ sağlayıcısı aşağıdaki işleçleri destekler:

  • Seç: Projeksiyonlar nesne oluşturma dahil olmak üzere SELECT'e çevrilir.
  • Nerede: Filtreler WHERE'a çevrilir ve , ||ve ! NoSQL işleçleri arasında &&çeviriyi destekler
  • SelectMany: DIZIlerin JOIN yan tümcesine geri sarmasını sağlar. Dizi öğelerine filtre uygulamak için ifadeleri zincirleme veya iç içe yerleştirme için kullanın.
  • OrderBy ve OrderByDescending: ASC veya DESC ile ORDER BY'a çevirin.
  • Toplama için Count, Sum, Min, Max ve Average işleçleri ve bunların zaman uyumsuz eşdeğerleri CountAsync, SumAsync, MinAsync, MaxAsync ve AverageAsync.
  • CompareTo: Aralık karşılaştırmalarına çevirir. Bu işleç, .NET'te karşılaştırılmadığından genellikle dizeler için kullanılır.
  • Atla ve Al: Sorgudan gelen sonuçları sınırlamak ve sayfalandırma yapmak için OFFSET ve LIMIT'e çevirir.
  • Matematik işlevleri: .NET Abs, , Acos, Asin, Atan, Ceiling, , Cos, , Exp, , Floor, Log10SignLogSqrtTanSinPowRoundve Truncate eşdeğer yerleşik matematik işlevlerine çeviriyi destekler.
  • Dize işlevleri: .NET Concat, , , CountContains,EndsWithIndexOf, , Replace, , Reverse, ToUpperTrimEndToLowerStartsWithSubStringve TrimStart eşdeğer yerleşik dize işlevlerine çeviriyi destekler.
  • Dizi işlevleri: .NET Concat, Containsve Count 'den eşdeğer yerleşik dizi işlevlerine çeviriyi destekler.
  • Jeo-uzamsal Uzantı işlevleri: saplama yöntemleri Distance, , IsValidIsValidDetailedve'den Within eşdeğer yerleşik jeo-uzamsal işlevlere çeviriyi destekler.
  • Kullanıcı Tanımlı İşlev Uzantısı işlevi: CosmosLinq.InvokeUserDefinedFunction saplama yönteminden ilgili kullanıcı tanımlı işleve çeviriyi destekler.
  • Çeşitli: ve koşullu işleçlerin çevirisini Coalesce destekler. Bağlama bağlı olarak Dize İÇERİSİ, ARRAY_CONTAINS veya IN olarak çevrilebilir Contains .

Örnekler

Aşağıdaki örneklerde standart LINQ sorgu işleçlerinden bazılarının Azure Cosmos DB'deki sorgulara nasıl çevrildiği gösterilmektedir.

İşleç seçme

Söz dizimi , input.Select(x => f(x))burada f skaler bir ifadedir. input, bu durumda bir IQueryable nesne olacaktır.

İşleci seçin, örnek 1:

  • LINQ lambda ifadesi

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

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

Işleç seçin, örnek 2:

  • LINQ lambda ifadesi

    input.Select(family => family.children[0].grade + c); // c is an int variable
    
  • NoSQL

    SELECT VALUE f.children[0].grade + c
    FROM Families f
    

İşleci seçin, örnek 3:

  • LINQ lambda ifadesi

    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 işleci

Söz dizimi, input.SelectMany(x => f(x))burada f kapsayıcı türü döndüren bir skaler ifadedir.

  • LINQ lambda ifadesi

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

    SELECT VALUE child
    FROM child IN Families.children
    

Where işleci

Söz dizimi, input.Where(x => f(x))burada f Boole değeri döndüren bir skaler ifadedir.

Where işleci, örnek 1:

  • LINQ lambda ifadesi

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

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

Where işleci, örnek 2:

  • LINQ lambda ifadesi

    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
    

Bileşik NoSQL sorguları

Daha güçlü sorgular oluşturmak için önceki işleçleri oluşturabilirsiniz. Azure Cosmos DB iç içe kapsayıcıları desteklediğinden, bileşimi birleştirebilir veya iç içe yerleştirebilirsiniz.

Bitiştirme

Söz dizimi input(.|.SelectMany())(.Select()|.Where())* şeklindedir. Birleştirilmiş sorgu isteğe bağlı SelectMany bir sorguyla başlayabilir ve ardından birden çok Select veya Where işleç gelebilir.

Birleştirme, örnek 1:

  • LINQ lambda ifadesi

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

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

Birleştirme, örnek 2:

  • LINQ lambda ifadesi

    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
    

Birleştirme, örnek 3:

  • LINQ lambda ifadesi

    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)
    

Birleştirme, örnek 4:

  • LINQ lambda ifadesi

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

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

Iç içe

Söz dizimi , veya işlecinin olduğu yerdirinput.SelectMany(x=>x.Q()).Q SelectSelectManyWhere

İç içe yerleştirilmiş sorgu, iç sorguyu dış kapsayıcının her öğesine uygular. Önemli bir özellik, iç sorgunun kendi kendine birleştirme gibi dış kapsayıcıdaki öğelerin alanlarına başvurabilmesidir.

İç içe yerleştirme, örnek 1:

  • LINQ lambda ifadesi

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

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

İç içe yerleştirme, örnek 2:

  • LINQ lambda ifadesi

    input.SelectMany(family =>
        family.children.Where(child => child.familyName == "Jeff"));
    
  • NoSQL

    SELECT *
    FROM Families f
    JOIN c IN f.children
    WHERE c.familyName = "Jeff"
    

İç içe yerleştirme, örnek 3:

  • LINQ lambda ifadesi

    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