DocumentDB SQL - Linq'den SQL'e Çeviri

DocumentDB'de, belgeleri sorgulamak için aslında SQL kullanıyoruz. .NET geliştirme yapıyorsak, kullanılabilen ve bir LINQ sorgusundan uygun SQL oluşturabilen bir LINQ sağlayıcısı da vardır.

Desteklenen Veri Türleri

DocumentDB'de, tüm JSON ilkel türleri, aşağıdaki gibi DocumentDB .NET SDK ile birlikte verilen LINQ sağlayıcısında desteklenir -

  • Numeric
  • Boolean
  • String
  • Null

Desteklenen İfade

Aşağıdaki skaler ifadeler, DocumentDB .NET SDK ile birlikte gelen LINQ sağlayıcısında desteklenir.

  • Constant Values - İlkel veri türlerinin sabit değerlerini içerir.

  • Property/Array Index Expressions - İfadeler, bir nesnenin veya bir dizi öğesinin özelliğine atıfta bulunur.

  • Arithmetic Expressions - Sayısal ve Boole değerlerinde yaygın aritmetik ifadeler içerir.

  • String Comparison Expression - Bir dize değerinin sabit bir dize değeriyle karşılaştırılmasını içerir.

  • Object/Array Creation Expression- Bileşik değer türünde veya anonim türde bir nesne veya bu tür nesnelerden oluşan bir dizi döndürür. Bu değerler yuvalanabilir.

Desteklenen LINQ Operatörleri

DocumentDB .NET SDK ile birlikte verilen LINQ sağlayıcısında desteklenen LINQ operatörlerinin listesi aşağıdadır.

  • Select - Projeksiyonlar, nesne oluşturma dahil SQL SELECT'e çevrilir.

  • Where- Filtreler, SQL WHERE'ye çevrilir ve &&, || arasında çeviriyi destekler. ve ! SQL operatörlerine.

  • SelectMany- Dizilerin SQL JOIN yan tümcesine çözülmesine izin verir. Dizi öğelerini filtrelemek için ifadeleri zincirlemek / iç içe yerleştirmek için kullanılabilir.

  • OrderBy and OrderByDescending - Artan / azalan SİPARİŞ olarak çevirir.

  • CompareTo- Aralık karşılaştırmalarına çevirir. .

  • Take - Bir sorgudan alınan sonuçları sınırlandırmak için SQL TOP'a çevirir.

  • Math Functions - .NET'in Abs, Acos, Asin, Atan, Ceiling, Cos, Exp, Floor, Log, Log10, Pow, Round, Sign, Sin, Sqrt, Tan, Truncate'den eşdeğer SQL yerleşik işlevlerine çeviriyi destekler.

  • String Functions - .NET'in Concat, Contains, EndsWith, IndexOf, Count, ToLower, TrimStart, Replace, Reverse, TrimEnd, StartsWith, SubString, ToUpper'dan eşdeğer SQL yerleşik işlevlerine çeviriyi destekler.

  • Array Functions - .NET'in Concat, Contains ve Count'tan eşdeğer SQL yerleşik işlevlerine çeviriyi destekler.

  • Geospatial Extension Functions - Mesafe, Within, IsValid ve IsValidDetailed gibi saplama yöntemlerinden eşdeğer SQL yerleşik işlevlerine çeviriyi destekler.

  • User-Defined Extension Function - UserDefinedFunctionProvider.Invoke saplama yönteminden karşılık gelen kullanıcı tanımlı işleve çeviriyi destekler.

  • Miscellaneous- Birleştirme ve koşullu operatörlerin çevirisini destekler. İçeriği, bağlama bağlı olarak Dize CONTAINS, ARRAY_CONTAINS veya SQL IN'e çevirebilir.

Net SDK'yı kullanacağımız bir örneğe göz atalım. Bu örnek için ele alacağımız üç belge aşağıdadır.

Yeni Müşteri 1

{ 
   "name": "New Customer 1", 
   "address": { 
      "addressType": "Main Office", 
      "addressLine1": "123 Main Street", 
		
      "location": { 
         "city": "Brooklyn", 
         "stateProvinceName": "New York" 
      },
	  
      "postalCode": "11229", 
      "countryRegionName": "United States" 
   }, 
}

Yeni Müşteri 2

{ 
   "name": "New Customer 2", 
	
   "address": {
      "addressType": "Main Office", 
      "addressLine1": "678 Main Street", 
		
      "location": { 
         "city": "London", 
         "stateProvinceName": " London " 
      }, 
	  
      "postalCode": "11229", 
      "countryRegionName": "United Kingdom" 
   }, 
}

Yeni Müşteri 3

{ 
   "name": "New Customer 3", 
	
   "address": { 
      "addressType": "Main Office", 
      "addressLine1": "12 Main Street", 
		
      "location": { 
         "city": "Brooklyn", 
         "stateProvinceName": "New York" 
      },
	  
      "postalCode": "11229", 
      "countryRegionName": "United States" 
   },
}

LINQ kullanarak sorguladığımız kod aşağıdadır. Bir LINQ sorgusu tanımladıkq, ancak biz .ToList'i çalıştırana kadar çalıştırılmayacak.

private static void QueryDocumentsWithLinq(DocumentClient client) { 
   Console.WriteLine(); 
   Console.WriteLine("**** Query Documents (LINQ) ****"); 
   Console.WriteLine();  
   Console.WriteLine("Quering for US customers (LINQ)"); 
   var q = 
      from d in client.CreateDocumentQuery<Customer>(collection.DocumentsLink) 
      where d.Address.CountryRegionName == "United States" 
		
   select new { 
      Id = d.Id, 
      Name = d.Name, 
      City = d.Address.Location.City 
   };
   
   var documents = q.ToList();  
   Console.WriteLine("Found {0} US customers", documents.Count); 
	
   foreach (var document in documents) { 
      var d = document as dynamic; 
      Console.WriteLine(" Id: {0}; Name: {1}; City: {2}", d.Id, d.Name, d.City); 
   }
   
   Console.WriteLine(); 
}

SDK, LINQ sorgumuzu DocumentDB için SQL sözdizimine dönüştürecek ve LINQ sözdizimimize göre bir SELECT ve WHERE cümlesi oluşturacaktır.

Yukarıdaki sorguları CreateDocumentClient görevinden çağıralım.

private static async Task CreateDocumentClient() { 
   // Create a new instance of the DocumentClient 
   using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) { 
      database = client.CreateDatabaseQuery("SELECT * FROM c WHERE c.id = 
         'myfirstdb'").AsEnumerable().First(); 
      collection = client.CreateDocumentCollectionQuery(database.CollectionsLink, 
         "SELECT * FROM c WHERE c.id = 'MyCollection'").AsEnumerable().First();  
      QueryDocumentsWithLinq(client); 
   } 
}

Yukarıdaki kod çalıştırıldığında, aşağıdaki çıktıyı üretir.

**** Query Documents (LINQ) **** 
 
Quering for US customers (LINQ) 
Found 2 US customers 
   Id: 7e9ad4fa-c432-4d1a-b120-58fd7113609f; Name: New Customer 1; City: Brooklyn 
   Id: 34e9873a-94c8-4720-9146-d63fb7840fad; Name: New Customer 1; City: Brooklyn