在实际开发过程中我们经常面对一些查询或统计子表信息,对于一层处理还是比较简单,如果二层、三层等或更多时这个时候编写出来的条件就比较复杂和容易出现编写错误的情况。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 <= '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 &
Orders._OrderDate.At(Orders.TBL) >= 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._Discount))};
query.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方法过程中截取的.