SQL查询语句对象化的实现(C#)

在开发数据库应用的过程难免会编写大量的SQL语句,其中大部份是查询语句;为不同情况编写查询语句是一件很烦琐的事件。用过Hibernate或Nhibernate会了解到把SQL查询语句对象化后使用起非常方便和快捷;也大大减少在编写查询SQL语句所带来的错误等问题。
      前段时间在编写一个数据处理类的时候同样遇到这个问题,经过一段时间思考和设计现实现了SQL查询语句对象化的功能;在这里我把自己小小的成果共享一下。
在讲解前先看几个例子(数据是SQLServer的Northwind)注意:例子中所涉及的除查询对象化外还包含整个数据处理类的使用,那部分还在设计和完善当中。

      1)以上语句是查询订单ID为10264的订单信息

Code


对象生成的SQL语句:
SELECT * FROM Orders  where  1=1  And (OrderID = @OrderID0)

    2)以上语句是查询订单ID大于10264并且小于10600的订单信息

Code


对象生成的SQL语句:
SELECT * FROM Orders  where  1=1  And (OrderID > @OrderID0) And (OrderID < @OrderID1)

4)以上语句是查询订单ID大于10264并且小于10600或编号是10601,10602,10605的订单信息

Code


对象生成的SQL语句:
SELECT * FROM Orders  where  1=1  And (OrderID > @OrderID0) And (OrderID < @OrderID1) Or (OrderID in (@OrderID20,@OrderID21,@OrderID22))

从上面的例子我们可以看到对不同的条件进行数据查询只是一件很简单的事情,你并不用为不同的查询情况写相应SQL语句。
接下来讲术这个查询对象实现,对象的最终就是把不同字符串并起来生成相应的SQL语句;SQL语句查询语句主要分为以下几大部份:获取的字段,表名称,条件,排序,分组;了解SELECT语句的对查询语句的组成部分比较了解。
其中比较难的就是条件部分处理,因为条件的组合是情况是比较多;所以设计起来相对比较复杂。在设计的过程中把条件单独抽取出来,并生成接口对条件的表达式进行描述:

Code


在接口描述中有很多地方离不开HFSoft.Data.IDriverType它是用于描述数据库类型。根据HFSoft.Data.IDriverType    对应生成SqlServer,MySQL,Oracle等数据库的条件表达式。
为什么IExpression具有Add方法,并且添加的对象也是IExpression;因为条件自己可以包含多个子表达式,只有这样才能够灵活组合成复杂的条件表达式。
接下来看下基于这个接口的实现

Code


其实Expression只是一个模板类,它自己本生并没有条件处理的能力只是一个简单的1=1;下面我们根据这个模板类派生出具体表达式类型。

Code


整个条件对象的设计就完成了,文章代码中只有实现了等于的表达式对象;我们可以按自己情况编写更复杂的表达式。条件表达式对象在整个查询对象中是比较核心的部心,因为在整个SQL查询语句中除了这些条件外其它地方都是固定的,剩下的就是把些不同的字符串合并起来,这些东西就不详细说了大家比较了解。
其实Expression只是一个模板类,它自己本生并没有条件处理的能力只是一个简单的1=1;下面我们根据这个模板类派生出具体表达式类型。

Code


整个条件对象的设计就完成了,文章代码中只有实现了等于的表达式对象;我们可以按自己情况编写更复杂的表达式。条件表达式对象在整个查询对象中是比较核心的部心,因为在整个SQL查询语句中除了这些条件外其它地方都是固定的,剩下的就是把些不同的字符串合并起来,这些东西就不详细说了大家比较了解。



作者:henryfan  出处:博客园

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [ADO.Net] 的这些文章也感兴趣:

ADO.NET Entity Framework 体验:语言
如何将一个超级链接列绑定多个字段
NET 连接池救生员
把《亮剑》的DVD送给了一台湾朋友后的故事
ADO.NET2.0的十大新特性
ADO.Net data services开发框架学习
迈向Data 2.0——学习使用ADO.NET数据服务框架
支持实体框架的首批ADO.NET Provider已经准备就绪
ADO.NET Entity Framework 体验:安装及初试
获取数据库中的所有表