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