DocumentDB SQL - Dịch Linq sang SQL

Trong DocumentDB, chúng tôi thực sự sử dụng SQL để truy vấn tài liệu. Nếu chúng tôi đang phát triển .NET, thì cũng có một trình cung cấp LINQ có thể được sử dụng và có thể tạo SQL thích hợp từ một truy vấn LINQ.

Các loại dữ liệu được hỗ trợ

Trong DocumentDB, tất cả các kiểu nguyên thủy JSON đều được hỗ trợ trong trình cung cấp LINQ đi kèm với DocumentDB .NET SDK như sau:

  • Numeric
  • Boolean
  • String
  • Null

Biểu thức được hỗ trợ

Các biểu thức vô hướng sau được hỗ trợ trong trình cung cấp LINQ có trong SDK DocumentDB .NET.

  • Constant Values - Bao gồm các giá trị không đổi của các kiểu dữ liệu nguyên thủy.

  • Property/Array Index Expressions - Biểu thức chỉ thuộc tính của một đối tượng hoặc một phần tử mảng.

  • Arithmetic Expressions - Bao gồm các biểu thức số học thông thường về giá trị số và Boolean.

  • String Comparison Expression - Bao gồm việc so sánh một giá trị chuỗi với một số giá trị chuỗi không đổi.

  • Object/Array Creation Expression- Trả về một đối tượng có kiểu giá trị phức hợp hoặc kiểu ẩn danh hoặc một mảng các đối tượng đó. Các giá trị này có thể được lồng vào nhau.

Các nhà khai thác LINQ được hỗ trợ

Đây là danh sách các toán tử LINQ được hỗ trợ trong nhà cung cấp LINQ đi kèm với DocumentDB .NET SDK.

  • Select - Các phép chiếu dịch sang SQL SELECT bao gồm cả việc xây dựng đối tượng.

  • Where- Bộ lọc dịch sang SQL WHERE và hỗ trợ dịch giữa &&, || và! cho các toán tử SQL.

  • SelectMany- Cho phép giải nén các mảng với mệnh đề SQL JOIN. Có thể được sử dụng để chuỗi / lồng biểu thức để lọc các phần tử mảng.

  • OrderBy and OrderByDescending - Dịch sang ORDER BY tăng dần / giảm dần.

  • CompareTo- Chuyển sang so sánh phạm vi. Thường được sử dụng cho các chuỗi vì chúng không thể so sánh được trong .NET.

  • Take - Dịch sang SQL TOP để giới hạn kết quả từ một truy vấn.

  • Math Functions - Hỗ trợ dịch từ Abs, Acos, Asin, Atan, Ceiling, Cos, Exp, Floor, Log, Log10, Pow, Round, Sign, Sin, Sqrt, Tan, Truncate của .NET sang các hàm tích hợp SQL tương đương.

  • String Functions - Hỗ trợ dịch từ .NET's Concat, Contains, EndsWith, IndexOf, Count, ToLower, TrimStart, Replace, Reverse, TrimEnd, StartsWith, SubString, ToUpper sang các hàm tích hợp SQL tương đương.

  • Array Functions - Hỗ trợ dịch từ Concat, Contains và Count của .NET sang các hàm tích hợp SQL tương đương.

  • Geospatial Extension Functions - Hỗ trợ dịch từ các phương thức sơ khai Khoảng cách, Trong vòng, IsValid và IsValidDetailed sang các hàm tích hợp sẵn trong SQL tương đương.

  • User-Defined Extension Function - Hỗ trợ dịch từ phương thức sơ khai UserDefinedFunctionProvider.Gọi đến chức năng do người dùng định nghĩa tương ứng.

  • Miscellaneous- Hỗ trợ dịch các toán tử liên kết và có điều kiện. Có thể dịch Chứa thành chuỗi CONTAINS, ARRAY_CONTAINS hoặc SQL IN tùy thuộc vào ngữ cảnh.

Hãy xem một ví dụ mà chúng ta sẽ sử dụng .Net SDK. Sau đây là ba tài liệu mà chúng tôi sẽ xem xét cho ví dụ này.

Khách hàng mới 1

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

Khách hàng mới 2

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

Khách hàng mới 3

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

Sau đây là đoạn mã mà chúng tôi truy vấn bằng LINQ. Chúng tôi đã xác định một truy vấn LINQ trongq, nhưng nó sẽ không thực thi cho đến khi chúng ta chạy. Danh sách trên đó.

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 sẽ chuyển đổi truy vấn LINQ của chúng tôi thành cú pháp SQL cho DocumentDB, tạo mệnh đề SELECT và WHERE dựa trên cú pháp LINQ của chúng tôi.

Hãy gọi các truy vấn trên từ tác vụ 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); 
   } 
}

Khi đoạn mã trên được thực thi, nó sẽ tạo ra kết quả sau.

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