DocumentDB SQL - Linq เป็น SQL Translation
ใน DocumentDB เราใช้ SQL ในการสืบค้นเอกสาร หากเรากำลังทำการพัฒนา. NET นอกจากนี้ยังมีผู้ให้บริการ LINQ ที่สามารถใช้งานได้และสามารถสร้าง SQL ที่เหมาะสมจากแบบสอบถาม LINQ
ประเภทข้อมูลที่รองรับ
ใน DocumentDB ประเภทพื้นฐาน JSON ทั้งหมดได้รับการสนับสนุนในตัวให้บริการ LINQ ที่มาพร้อมกับ DocumentDB .NET SDK ซึ่งมีดังต่อไปนี้ -
- Numeric
- Boolean
- String
- Null
นิพจน์ที่รองรับ
นิพจน์สเกลาร์ต่อไปนี้ได้รับการสนับสนุนในตัวให้บริการ LINQ ที่มาพร้อมกับ DocumentDB .NET SDK
Constant Values - รวมค่าคงที่ของประเภทข้อมูลดั้งเดิม
Property/Array Index Expressions - นิพจน์อ้างถึงคุณสมบัติของวัตถุหรือองค์ประกอบอาร์เรย์
Arithmetic Expressions - รวมนิพจน์เลขคณิตทั่วไปเกี่ยวกับค่าตัวเลขและค่าบูลีน
String Comparison Expression - รวมถึงการเปรียบเทียบค่าสตริงกับค่าสตริงคงที่
Object/Array Creation Expression- ส่งคืนวัตถุประเภทค่าผสมหรือชนิดที่ไม่ระบุตัวตนหรืออาร์เรย์ของวัตถุดังกล่าว ค่าเหล่านี้สามารถซ้อนกันได้
ตัวดำเนินการ LINQ ที่รองรับ
นี่คือรายการของตัวดำเนินการ LINQ ที่สนับสนุนในตัวให้บริการ LINQ ที่มาพร้อมกับ DocumentDB .NET SDK
Select - ประมาณการแปลเป็น SQL SELECT รวมถึงการสร้างวัตถุ
Where- ตัวกรองแปลเป็น SQL WHERE และรองรับการแปลระหว่าง &&, || และ! ไปยังตัวดำเนินการ SQL
SelectMany- อนุญาตให้คลายอาร์เรย์ของส่วนคำสั่ง SQL JOIN สามารถใช้เพื่อเชื่อมโยงนิพจน์ / รังเพื่อกรององค์ประกอบอาร์เรย์
OrderBy and OrderByDescending - แปลเป็น ORDER โดยขึ้น / ลง
CompareTo- แปลเป็นการเปรียบเทียบช่วง ใช้กันทั่วไปสำหรับสตริงเนื่องจากไม่สามารถเทียบเคียงได้ใน. NET
Take - แปลเป็น SQL TOP เพื่อ จำกัด ผลลัพธ์จากแบบสอบถาม
Math Functions - รองรับการแปลจาก. NET's Abs, Acos, Asin, Atan, Ceiling, Cos, Exp, Floor, Log, Log10, Pow, Round, Sign, Sin, Sqrt, Tan, Truncate ให้เทียบเท่ากับฟังก์ชันในตัวของ SQL
String Functions - รองรับการแปลจาก. NET's Concat, ประกอบด้วย, EndsWith, IndexOf, Count, ToLower, TrimStart, Replace, Reverse, TrimEnd, StartsWith, SubString, ToUpper เป็นฟังก์ชันในตัวของ SQL ที่เทียบเท่า
Array Functions - รองรับการแปลจาก. NET ของ Concat, มีและนับเป็นฟังก์ชันในตัวของ SQL ที่เทียบเท่า
Geospatial Extension Functions - รองรับการแปลจากวิธีการต้นขั้ว Distance, Within, IsValid และ IsValidDetailed เป็นฟังก์ชันในตัวของ SQL ที่เทียบเท่า
User-Defined Extension Function - รองรับการแปลจากวิธีต้นขั้ว UserDefinedFunctionProvider เรียกใช้ฟังก์ชันที่ผู้ใช้กำหนดที่เกี่ยวข้อง
Miscellaneous- รองรับการแปลตัวดำเนินการประสานและเงื่อนไข สามารถแปลมีเป็นสตริง 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 เราได้กำหนดแบบสอบถาม LINQ ในqแต่มันจะไม่ทำงานจนกว่าเราจะเรียกใช้. 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 ของเราเป็นไวยากรณ์ SQL สำหรับ DocumentDB โดยสร้างส่วนคำสั่ง SELECT และ WHERE ตามไวยากรณ์ LINQ ของเรา
เรียกแบบสอบถามข้างต้นจากงาน 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