- DocumentDB SQL 教程
- DocumentDB SQL - 主页
- DocumentDB SQL - 概述
- DocumentDB SQL - 选择子句
- DocumentDB SQL - From 子句
- DocumentDB SQL -Where 子句
- DocumentDB SQL - 运算符
- DocumentDB - Between 关键字
- DocumentDB SQL - In 关键字
- DocumentDB SQL - 值关键字
- DocumentDB SQL - Order By 子句
- DocumentDB SQL - 迭代
- DocumentDB SQL - 连接
- DocumentDB SQL - 别名
- DocumentDB SQL - 数组创建
- DocumentDB - 标量表达式
- DocumentDB SQL - 参数化
- DocumentDB SQL - 内置函数
- Linq 到 SQL 翻译
- JavaScript 集成
- 用户定义函数
- 复合 SQL 查询
- DocumentDB SQL 有用资源
- DocumentDB SQL - 快速指南
- DocumentDB SQL - 有用的资源
- DocumentDB 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、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