ในกระบวนการพัฒนาจริง เรามักจะเผชิญกับคำถามหรือข้อมูลตารางย่อยทางสถิติ สำหรับการประมวลผลหนึ่งระดับ มันค่อนข้างง่าย หากมีสองระดับ สามระดับ ฯลฯ ขึ้นไป เงื่อนไขที่เขียนในเวลานี้จะ มีความซับซ้อนมากขึ้นและมีแนวโน้มที่จะเขียนสถานการณ์ผิดพลาด นอกเหนือจากการจัดเตรียมฟังก์ชันการดำเนินการเปรียบเทียบที่ยืดหยุ่นแล้ว ออบเจ็กต์ฟิลด์ SQL Artisan ยังมีฟังก์ชันการซ้อนเงื่อนไขระดับ N ในเมธอด In ของออบเจ็กต์ ซึ่งช่วยให้คุณมีความยืดหยุ่นมากขึ้นในการสร้างเงื่อนไขการสืบค้น
ใช้ NorthWind ของ MSSQL เป็นตัวอย่าง:
ค้นหายอดขายของพนักงานที่ระบุในช่วงเวลาหนึ่ง
ตารางที่ประมวลผล: พนักงาน คำสั่งซื้อ รายละเอียดคำสั่งซื้อ
ในระหว่างขั้นตอนการใช้งาน คุณสามารถสืบค้นผ่านการเชื่อมโยงตารางหรือสืบค้นตารางเป้าหมายโดยตรง คุณต้องเพิ่มเงื่อนไขของตารางหลักลงในเงื่อนไขการสืบค้นปัจจุบัน ลักษณะที่ซ้อนกัน
Employee.Employee->Orders.OrderDate->Sum(Order Detail) ทำให้การซ้อนเงื่อนไขย้อนกลับ
ต่อไปนี้เป็นการนำวิธีการสืบค้นสองวิธีไปใช้ภายใต้คำสั่ง SQL และส่วนประกอบ SQL Artisa
(รหัสนี้ใช้เพื่อแสดงฟังก์ชันของส่วนประกอบ SQL Artisan เท่านั้น และปัญหาอื่น ๆ ที่มีอยู่ในคำสั่ง SQL จะไม่ถูกกล่าวถึง)
วิธี SQL ที่หนึ่ง:
SELECT Sum(UnitPrice*Quantity*(1-Discount)) จาก Employees INNER JOIN Order ON Employees.EmployeeID= orders.EmployeeID INNER JOIN [รายละเอียดการสั่งซื้อ] ON orders.OrderID=[รายละเอียดการสั่งซื้อ].OrderID โดยที่ ( ( Employees.EmployeeID = 3 And orders.OrderDate >= '1997-7-1' ) และ คำสั่งซื้อวันที่สั่งซื้อ <= '1997 -8-1')
วิธี SQL Artisan หนึ่ง:
query = session.CreateQuery(Employees.TBL.INNER(Orders.TBL,Orders._EmployeeID)&
orders.TBL.INNER(OrderDetails.TBL,Orders._OrderID));
query.Selects= new FieldAdapter[] {SqlMath.Sum(OrderDetails._UnitPrice*OrderDetails._Quantity*(1-OrderDetails._Discount))};
query.Expreesion = Employees._EmployeeID.At(Employees.TBL) ==3 &
คำสั่งซื้อ._OrderDate.At(Orders.TBL ) >= DateTime.Parse("1997-7-1")&
orders._OrderDate.At(Orders.TBL) <= DateTime.Parse("1997-8-1");
ds = query.ExecuteDataSet()
; วิธีที่ 2:
เลือกผลรวม(UnitPrice*Quantity*(1-Discount)) จาก [รายละเอียดคำสั่งซื้อ] โดยที่ OrderID ใน (เลือก OrderID จากคำสั่งซื้อโดยที่ ( ( ( OrderDate >= '1997-7-1'And OrderDate < '1997-8 -1' ) และ EmployeeID ใน (เลือก EmployeeID จาก Employees โดยที่ ( EmployeeID = 3 )) ) ))
วิธีที่สองของ SQL Artisan:
IQuery query = session.CreateQuery(OrderDetails.TBL);
query.Selects= new FieldAdapter[]{SqlMath.Sum(OrderDetails._UnitPrice*OrderDetails._Quantity*(1-OrderDetails._Discount))}
; Expresion = OrderDetails._OrderID.In(Orders.TBL,Orders._OrderID,
orders._OrderDate >= DateTime.Parse("1997-7-1") &
orders._OrderDate < DateTime.Parse("1997-8-1") &
Order._EmployeeID.In (พนักงาน.TBL,พนักงาน._EmployeeID,พนักงาน._EmployeeID ==3));
System.Data.DataSet ds = query.ExecuteDataSet();
จากโค้ดด้านบน คุณจะเห็นว่าส่วนประกอบ SQL Artisan ซ้อนเงื่อนไขหลายระดับได้อย่างสะดวกและยืดหยุ่นผ่านวิธี In ของออบเจ็กต์ฟิลด์ ไม่ใช่ความคิดที่ไม่ดีสำหรับนักพัฒนาที่จะใช้สตริงเพื่อสะกดคำสั่ง SQL เมื่อเขียนคำสั่งที่ยุ่งยากเช่นนี้ เงื่อนไขการสืบค้น ฝัน แต่การตรวจสอบความถูกต้องตามกฎหมายด้วยตนเองก็เป็นเรื่องที่น่าปวดหัวเช่นกัน ไม่ต้องพูดถึงว่าหลายครั้งที่เราต้องเผชิญกับเงื่อนไขการสืบค้นที่ซับซ้อนมากขึ้น
สิ่งที่ SQL Artisan นำมาให้คุณคือวิธีการเขียนเงื่อนไขตามอ็อบเจ็กต์โดยสมบูรณ์ และจัดเตรียมการคอมไพล์และการทดสอบสภาพแวดล้อมการพัฒนา ซึ่งช่วยปรับปรุงประสิทธิภาพและคุณภาพของเงื่อนไขการเขียนได้อย่างมาก
ในความเป็นจริง คำสั่ง SQL ของ SQL ทั้งสองวิธีถูกดักจับโดยการรันวิธี SQL Artisan