DocumentDB SQL - Terjemahan Linq ke SQL

Di DocumentDB, kami benar-benar menggunakan SQL untuk meminta dokumen. Jika kita melakukan pengembangan .NET, ada juga penyedia LINQ yang dapat digunakan dan yang dapat menghasilkan SQL yang sesuai dari kueri LINQ.

Jenis Data yang Didukung

Di DocumentDB, semua tipe primitif JSON didukung di penyedia LINQ yang disertakan dengan DocumentDB .NET SDK, yaitu sebagai berikut -

  • Numeric
  • Boolean
  • String
  • Null

Ekspresi yang Didukung

Ekspresi skalar berikut ini didukung dalam penyedia LINQ yang disertakan dengan DocumentDB .NET SDK.

  • Constant Values - Termasuk nilai konstan dari tipe data primitif.

  • Property/Array Index Expressions - Ekspresi mengacu pada properti objek atau elemen array.

  • Arithmetic Expressions - Termasuk ekspresi aritmatika umum pada nilai numerik dan Boolean.

  • String Comparison Expression - Termasuk membandingkan nilai string dengan beberapa nilai string konstan.

  • Object/Array Creation Expression- Mengembalikan objek dari tipe nilai majemuk atau tipe anonim atau larik objek semacam itu. Nilai-nilai ini dapat disarangkan.

Operator LINQ yang Didukung

Berikut adalah daftar operator LINQ yang didukung dalam penyedia LINQ yang disertakan dengan DocumentDB .NET SDK.

  • Select - Proyeksi diterjemahkan ke SQL SELECT termasuk konstruksi objek.

  • Where- Filter menerjemahkan ke SQL WHERE, dan mendukung terjemahan antara &&, || dan! ke operator SQL.

  • SelectMany- Memungkinkan pelepasan array ke klausa SQL JOIN. Dapat digunakan untuk ekspresi rantai / sarang untuk memfilter elemen array.

  • OrderBy and OrderByDescending - Diterjemahkan menjadi ORDER BY ascending / descending.

  • CompareTo- Diterjemahkan menjadi perbandingan rentang. Umumnya digunakan untuk string karena tidak sebanding dengan .NET.

  • Take - Diterjemahkan ke SQL TOP untuk membatasi hasil dari kueri.

  • Math Functions - Mendukung terjemahan dari .NET's Abs, Acos, Asin, Atan, Ceiling, Cos, Exp, Floor, Log, Log10, Pow, Round, Sign, Sin, Sqrt, Tan, Truncate ke fungsi SQL built-in yang setara.

  • String Functions - Mendukung terjemahan dari .NET Concat, Contains, EndsWith, IndexOf, Count, ToLower, TrimStart, Replace, Reverse, TrimEnd, StartsWith, SubString, ToUpper ke fungsi built-in SQL yang setara.

  • Array Functions - Mendukung terjemahan dari .NET Concat, Contains, dan Count ke fungsi built-in SQL yang setara.

  • Geospatial Extension Functions - Mendukung terjemahan dari metode rintisan Distance, Within, IsValid, dan IsValidDetailed ke fungsi built-in SQL yang setara.

  • User-Defined Extension Function - Mendukung terjemahan dari metode rintisan UserDefinedFunctionProvider.Invoke ke fungsi yang ditentukan pengguna terkait.

  • Miscellaneous- Mendukung terjemahan operator coalesce dan kondisional. Dapat menerjemahkan Berisi ke String BERISI, ARRAY_CONTAINS atau SQL IN tergantung pada konteks.

Mari kita lihat contoh di mana kita akan menggunakan .Net SDK. Berikut adalah tiga dokumen yang akan kami pertimbangkan untuk contoh ini.

Pelanggan Baru 1

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

Pelanggan Baru 2

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

Pelanggan Baru 3

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

Berikut ini adalah kode yang kami kueri menggunakan LINQ. Kami telah menentukan kueri LINQ diq, tetapi tidak akan dijalankan sampai kita menjalankan .ToList di atasnya.

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 akan mengubah kueri LINQ kami menjadi sintaks SQL untuk DocumentDB, menghasilkan klausa SELECT dan WHERE berdasarkan sintaks LINQ kami.

Mari panggil kueri di atas dari tugas CreateDocumentClient.

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); 
   } 
}

Ketika kode di atas dijalankan, ini menghasilkan keluaran sebagai berikut.

**** 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