在實際開發過程中我們經常面對一些查詢或統計子表信息,對於一層處理還是比較簡單,如果二層、三層等或更多時這個時候編寫出來的條件就比較複雜和容易出現編寫錯誤的情況。 SQL Artisan欄位物件除了提供靈活的比較運算功能外,物件的In方法還提供N層條件嵌套的功能,讓你在建構查詢條件更靈活。
以MSSQL的NorthWind為例:
查詢指定員工在某段時間的銷售金額。
處理的表:Employees,Orders,Order Details
在實現過程可以透過表關聯查詢或直接對目標表進行查詢,對目標表直接進行查詢就必須把父表的條件以嵌套的方式添加到當前查詢條件中。
Employee.Employee->Orders.OrderDate-> Sum(Order Details)作一個反向條件巢狀。
以下是兩種查詢方法在SQL語句和SQL Artisa元件下的實作。
(程式碼只是用來表達SQL Artisan元件的功能,對於SQL語句本身存在的其他問題不作討論)
SQL方法一:
SELECT Sum(UnitPrice*Quantity*(1-Discount)) FROM Employees INNER JOIN Orders ON Employees.EmployeeID= Orders.EmployeeID INNER JOIN [Order Details] ON Orders.OrderID=[Order Details].OrderID where ( ( Employees.EmployeeID = 3 And Orders.OrderDate >= '1997-7-1' ) And Orders.OrderDate < '19997 -8-1')
SQL Artisan方法一:
query = session.CreateQuery(Employees.TBL.INNER(Orders.TBL,Orders._EmployeeID)&
Orders.TBL.INNER(OrderDetails.TBL,Orders._OrderID));
query.Selects= new FieldAdter[] {SqlMath.Sum(OrderDetails._UnitPrice*OrderDetails._Quantity*(1-OrderDetails._Discount))};
query.Expreesion = Employees._EmployeeID.At(Employees.TBL) ==3 &
Orders_OrderDateD. ) >= DateTime.Parse("1997-7-1")&
Orders._OrderDate.At(Orders.TBL) <= DateTime.Parse("1997-8-1");
ds = query.ExecuteDataSet();
SQL方法二:
SELECT Sum(UnitPrice*Quantity*(1-Discount)) FROM [Order Details] where OrderID in (select OrderID from Orders where ( ( ( OrderDate >= '1997-7-1'And OrderDate < '1997-8 -1' ) And EmployeeID in (select EmployeeID from Employees where ( EmployeeID = 3 )) ) ))
SQL Artisan方法二:
IQuery query = session.CreateQuery(OrderDetails.TBL);
query.Selects= new FieldAdapter[]{SqlMath.Sum(OrderDetails._UnitPrice*OrderDetails._Quantity*(1-
OrderDetails._UnitPrice*OrderDetails._Quantity*(1-OrderDetails).
Expreesion = OrderDetails._OrderID.In(Orders.TBL,Orders._OrderID,
Orders._OrderDate >= DateTime.Parse("1997-7-1") &
Orders._OrderDate < DateTime.Parse("1997-8-1") &
Orders._EmployeeID.In(Employees.TBL,Employees._EmployeeID,Employees._EmployeeID ==3));
System.Data.DataSet ds = query.ExecuteDataSet();
從以上程式碼可以看到SQL Artisan元件透過字段物件的In方法方便靈活地把多層條件嵌套起來,在寫這麼煩瑣的查詢條件時用字串拼揍SQL語句對開發人員來說並不是什麼惡夢,但在人手檢測其合法性上也是個非常頭痛的問題;何況很多時候要面對更複雜的查詢條件。
SQL Artisan為你所帶來的是完全物件化的條件編寫方式並提供開發環境的編譯檢測,大大提高了條件的編寫效率和品質。
其實SQL兩個方法的SQL語句都是透過運行SQL Artisan方法過程中截取的.