DocumentDB SQL – Linq 到 SQL 的翻译

DocumentDB SQL – Linq 到 SQL 的翻译


在 DocumentDB 中,我们实际上使用 SQL 来查询文档。如果我们正在进行 .NET 开发,还有一个 LINQ 提供程序可以使用,它可以从 LINQ 查询生成适当的 SQL。

支持的数据类型

在 DocumentDB 中,DocumentDB .NET SDK 随附的 LINQ 提供程序支持所有 JSON 基元类型,如下所示 –

  • 数字
  • 布尔值
  • 细绳
  • 无效的

支持的表达式

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、Concat、Contains、EndsWith、IndexOf、Count、ToLower、TrimStart、Replace、Reverse、TrimEnd、StartsWith、SubString、ToUpper 转换为等效的 SQL 内置函数。

  • Array Functions – 支持从 .NET 的 Concat、Contains 和 Count 转换为等效的 SQL 内置函数。

  • 地理空间扩展函数– 支持从存根方法距离、内部、IsValid 和 IsValidDetailed 转换为等效的 SQL 内置函数。

  • User-DefinedFunctionProvider.Invoke支持从存根方法 UserDefinedFunctionProvider.Invoke 转换为相应的用户定义函数。

  • 杂项– 支持合并和条件运算符的翻译。可以根据上下文将包含转换为字符串 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 

觉得文章有用?

点个广告表达一下你的爱意吧 !😁