Documentdb Sql 简明教程

DocumentDB SQL - Linq to SQL Translation

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

Supported Data Types

在 DocumentDB 中,随 DocumentDB .NET SDK 包含的 LINQ 提供程序支持所有 JSON 原始类型,它们如下所示 −

  1. Numeric

  2. Boolean

  3. String

  4. Null

Supported Expression

以下标量表达式由随 DocumentDB .NET SDK 包含的 LINQ 提供程序支持。

  1. Constant Values − 包含原始数据类型的常数值。

  2. Property/Array Index Expressions - 表达式引用对象的属性或数组元素。

  3. Arithmetic Expressions - 包含数值和布尔值的常见算术表达式。

  4. String Comparison Expression - 包含将字符串值与某个常量字符串值进行比较。

  5. Object/Array Creation Expression − 返回复合值类型或匿名类型对象或此类对象的数组。这些值可以嵌套。

Supported LINQ Operators

以下是随 DocumentDB .NET SDK 包含的 LINQ 提供程序中支持的 LINQ 运算符列表。

  1. Select − 投影转换为 SQL SELECT,包括对象构造。

  2. Where − 筛选器转换为 SQL WHERE,并支持在 &&、|| 和 ! 与 SQL 运算符之间的转换。

  3. SelectMany − 允许将数组解压缩到 SQL JOIN 子句。可用于链/嵌套表达式以筛选数组元素。

  4. OrderBy and OrderByDescending − 转换为升序/降序 ORDER BY。

  5. CompareTo − 转换为范围比较。通常用于字符串,因为在 .NET 中它们不可比较。

  6. Take − 转换为 SQL TOP,用于限制查询结果。

  7. Math Functions − 支持从 .NET 的 Abs、Acos、Asin、Atan、Ceiling、Cos、Exp、Floor、Log、Log10、Pow、Round、Sign、Sin、Sqrt、Tan、Truncate 转换为等效的 SQL 内置函数。

  8. String Functions − 支持从 .NET 的 Concat、Contains、EndsWith、IndexOf、Count、ToLower、TrimStart、Replace、Reverse、TrimEnd、StartsWith、SubString、ToUpper 到等效的 SQL 内置函数的转换。

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

  10. Geospatial Extension Functions − 支持将 Distance、Within、IsValid 和 IsValidDetailed 存根方法转换为等效的 SQL 内置函数。

  11. User-Defined Extension Function − 支持将 UserDefinedFunctionProvider.Invoke 存根方法转换为对应的用户定义函数。

  12. Miscellaneous − 支持转换合并和条件运算符。可根据上下文将 Contains 转换成 String CONTAINS、ARRAY_CONTAINS 或 SQL IN。

我们来看一个使用 .Net SDK 的示例。以下三个文档我们将在本示例中考虑。

New Customer 1

{
   "name": "New Customer 1",
   "address": {
      "addressType": "Main Office",
      "addressLine1": "123 Main Street",

      "location": {
         "city": "Brooklyn",
         "stateProvinceName": "New York"
      },

      "postalCode": "11229",
      "countryRegionName": "United States"
   },
}

New Customer 2

{
   "name": "New Customer 2",

   "address": {
      "addressType": "Main Office",
      "addressLine1": "678 Main Street",

      "location": {
         "city": "London",
         "stateProvinceName": " London "
      },

      "postalCode": "11229",
      "countryRegionName": "United Kingdom"
   },
}

New Customer 3

{
   "name": "New Customer 3",

   "address": {
      "addressType": "Main Office",
      "addressLine1": "12 Main Street",

      "location": {
         "city": "Brooklyn",
         "stateProvinceName": "New York"
      },

      "postalCode": "11229",
      "countryRegionName": "United States"
   },
}

以下是在 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