XuGang

记录一个程序员的成长

 

SQL Artisan多层查询条件嵌套功能(转)


来源:http://www.hackhome.com/html/jskf/mssql/2007/0209/62994.html

在实际开发过程中我们经常面对一些查询或统计子表信息,对于一层处理还是比较简单,如果二层、三层等或更多时这个时候编写出来的条件就比较复杂和容易出现编写错误的情况。SQL Artisan字段对象除了提供灵活的比较运算功能外,对象的In方法还提供N层条件嵌套的功能,让你在构造查询条件更灵活。

以MSSQL的NorthWind为例:

查询指定雇员在某段时间的销售金额。

处理的表:Employees,Orders,Order Details

在实现过程可以通过表关联查询或直接对目标表进行查询,对目标表直接进行查询就必须把父表的条件以嵌套的方式添加到当前查询条件中。 字串8

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 & 字串3

             Orders._OrderDate.At(Orders.TBL) >= DateTime.Parse("1997-7-1")& 字串3

            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方法二: 字串2

IQuery query = session.CreateQuery(OrderDetails.TBL); 字串2

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(); 字串8

从以上代码可以看到SQL Artisan组件通过字段对象的In方法方便灵活地把多层条件嵌套起来,在编写这么烦琐的查询条件时用字符串拼揍SQL语句对开发人员来说并不是什么恶梦,但在人手检测其合法性上也是个非常头痛的问题;何况很多时候要面对更复杂的查询条件。 字串1

SQL Artisan给你所带来的是完全对象化的条件编写方式并提供开发环境的编译检测,大大提高了条件的编写效率和质量。

其实SQL两个方法的的SQL语句都是通过运行SQL Artisan方法过程中截取的.

 相应例子下载


参考文章: http://www.cnblogs.com/kain/archive/2007/11/02/946683.html


posted on   钢钢  阅读(432)  评论(1编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架

导航

统计

点击右上角即可分享
微信分享提示