📅  最后修改于: 2020-11-28 13:38:52             🧑  作者: Mango
在DocumentDB中,我们实际上使用SQL查询文档。如果我们正在进行.NET开发,则还可以使用LINQ提供程序,并且可以从LINQ查询生成适当的SQL。
在DocumentDB中,DocumentDB .NET SDK附带的LINQ提供程序支持所有JSON基本类型,如下所示-
DocumentDB .NET SDK附带的LINQ提供程序中支持以下标量表达式。
常量值-包括原始数据类型的常量值。
属性/数组索引表达式-表达式引用对象或数组元素的属性。
算术表达式-包括数字和布尔值的常用算术表达式。
字符串比较表达式-包括将字符串值与某个常量字符串值进行比较。
对象/数组创建表达式-返回复合值类型或匿名类型的对象或此类对象的数组。这些值可以嵌套。
这是DocumentDB .NET SDK附带的LINQ提供程序中受支持的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转换,包含,EndsWith,IndexOf,Count,ToLower,TrimStart,Replace,Reverse,TrimEnd,StartsWith,SubString,ToUpper到等效的SQL内置函数。
数组函数-支持从.NET的Concat,Contains和Count转换为等效的SQL内置函数。
地理空间扩展功能-支持从存根方法Distance,Intra,IsValid和IsValidDetailed转换为等效的SQL内置函数。
用户定义的扩展功能-支持从存根方法UserDefinedFunctionProvider.Invoke转换为相应的用户定义函数。
杂项-支持合并和条件运算符。可以根据上下文将包含转换为字符串CONTAINS,ARRAY_CONTAINS或SQL IN。
让我们看一个将使用.Net SDK的示例。以下是我们将为该示例考虑的三个文档。
{
"name": "New Customer 1",
"address": {
"addressType": "Main Office",
"addressLine1": "123 Main Street",
"location": {
"city": "Brooklyn",
"stateProvinceName": "New York"
},
"postalCode": "11229",
"countryRegionName": "United States"
},
}
{
"name": "New Customer 2",
"address": {
"addressType": "Main Office",
"addressLine1": "678 Main Street",
"location": {
"city": "London",
"stateProvinceName": " London "
},
"postalCode": "11229",
"countryRegionName": "United Kingdom"
},
}
{
"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