开发手册 欢迎您!
软件开发者资料库

DocumentDB SQL - Linq to SQL Translation

DocumentDB SQL Linq to SQL Translation - 从Overview,Select Clause,From Clause,Where Clause,Operators,Keyword,In Keyword,Value Keyword,Order By Clause,Iteration,Joins,Aliasing,Array开始,简单易学地学习DocumentDB SQL创建,标量表达式,参数化SQL,内置函数,Linq to SQL转换,JavaScript集成,用户定义函数,复合SQL查询。

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

支持的数据类型

在DocumentDB中,DocumentDB .NET SDK附带的LINQ提供程序支持所有JSON原语类型,如下所示 :

  • 数字

  • 布尔值

  • 字符串

支持的表达式

DocumentDB .NET SDK附带的LINQ提供程序支持以下标量表达式.

  • 常数值 : 包括原始数据类型的常量值.

  • 属性/数组索引表达式 : 表达式引用对象或数组元素的属性.

  • 算术表达式 : 包括数值和布尔值的通用算术表达式.

  • 字符串比较表达式 : 包括将字符串值与某个常量字符串值进行比较.

  • 对象/数组创建表达式 : 返回复合值类型或匿名类型的对象或此类对象的数组.这些值可以嵌套.

支持的LINQ运算符

以下是支持的LINQ列表DocumentDB .NET SDK附带的LINQ提供程序中的运算符.

  • 选择 : 预测转换为SQL SELECT,包括对象构造.

  • 其中 : 过滤器转换为SQL WHERE,并支持&&和,||而且! SQL运算符.

  • SelectMany : 允许将数组展开到SQL JOIN子句.可用于链式/嵌套表达式来过滤数组元素.

  • OrderBy和OrderByDescending : 转换为ORDER BY升序/降序.

  • CompareTo : 转换为范围比较.通常用于字符串,因为它们在.NET中不具有可比性.

  • 采取 : 转换为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,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(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