DocumentDB SQL - LINQ to SQL 轉換



在 DocumentDB 中,我們實際上使用 SQL 來查詢文件。如果我們正在進行 .NET 開發,還有一個可以使用的 LINQ 提供程式,它可以從 LINQ 查詢生成相應的 SQL。

支援的資料型別

在 DocumentDB 中,所有 JSON 基本型別都受 DocumentDB .NET SDK 中包含的 LINQ 提供程式支援,如下所示:

  • 數值
  • 布林值
  • 字串
  • 空值

支援的表示式

以下標量表達式受 DocumentDB .NET SDK 中包含的 LINQ 提供程式支援。

  • 常量值 - 包括基本資料型別的常量值。

  • 屬性/陣列索引表示式 - 表示式引用物件的屬性或陣列元素。

  • 算術表示式 - 包括對數值和布林值的常見算術表示式。

  • 字串比較表示式 - 包括將字串值與某個常量字串值進行比較。

  • 物件/陣列建立表示式 - 返回複合值型別或匿名型別物件或此類物件的陣列。這些值可以巢狀。

支援的 LINQ 運算子

以下是 DocumentDB .NET SDK 中包含的 LINQ 提供程式中支援的 LINQ 運算子列表。

  • Select - 投影轉換為 SQL SELECT,包括物件構造。

  • Where - 篩選器轉換為 SQL WHERE,並支援在 &&、|| 和 ! 與 SQL 運算子之間進行轉換。

  • SelectMany - 允許將陣列展開到 SQL JOIN 子句。可用於連結/巢狀表示式以篩選陣列元素。

  • OrderBy 和 OrderByDescending - 轉換為 ORDER BY 升序/降序。

  • CompareTo - 轉換為範圍比較。由於字串在 .NET 中不可比較,因此通常用於字串。

  • Take - 轉換為 SQL TOP 以限制查詢結果。

  • 數學函式 - 支援從 .NET 的 Abs、Acos、Asin、Atan、Ceiling、Cos、Exp、Floor、Log、Log10、Pow、Round、Sign、Sin、Sqrt、Tan、Truncate 轉換為等效的 SQL 內建函式。

  • 字串函式 - 支援從 .NET 的 Concat、Contains、EndsWith、IndexOf、Count、ToLower、TrimStart、Replace、Reverse、TrimEnd、StartsWith、SubString、ToUpper 轉換為等效的 SQL 內建函式。

  • 陣列函式 - 支援從 .NET 的 Concat、Contains 和 Count 轉換為等效的 SQL 內建函式。

  • 地理空間擴充套件函式 - 支援從存根方法 Distance、Within、IsValid 和 IsValidDetailed 轉換為等效的 SQL 內建函式。

  • 使用者定義擴充套件函式 - 支援從存根方法 UserDefinedFunctionProvider.Invoke 轉換為相應的使用者定義函式。

  • 其他 - 支援合併和條件運算子的轉換。可以根據上下文將 Contains 轉換為 String CONTAINS、ARRAY_CONTAINS 或 SQL IN。

讓我們來看一個我們將使用 .Net SDK 的示例。以下是我們將在此示例中考慮的三個文件。

新客戶 1

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

新客戶 2

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

新客戶 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 查詢的程式碼。我們在 q 中定義了一個 LINQ 查詢,但它只有在執行 .ToList 時才會執行。

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 查詢轉換為 DocumentDB 的 SQL 語法,根據我們的 LINQ 語法生成 SELECT 和 WHERE 子句。

讓我們從 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); 
   } 
}

執行上述程式碼時,會生成以下輸出。

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

© . All rights reserved.