C#运算符重载实现动态SQL生成
2011-10-15 10:01
295 查看
C#提供运算符重载功能,但这功能使用的场合并不多,相信很多C#开发人员虽然了解到有这一功能,但相信用到的比较少.为什么要自己重载运算符来生成SQL而不去用Linq?其目的也是非常简单的使用简单和灵活。先来看一下有多少运算符可以重载:+, -, *, /, %, &, |, ^, <<, >>==, !=, <, >, <=, >=
看上去还是挺多的,应该能满SQL对应的需要,首先整理出一个对应关系
c# SQL
== =
!= <>
> >
>= >=
< <
<= <=
& and
| or
总得来说基础的已经差不多了,但决少like,in等,这些可以使用函数或一技巧上的转换实现.
既然实现运算符重载,那当然就要重建一个对象做他基础实现,其作用就是类似于SQL中的字段.
?
表达一个字段的类型以上描述就足够了,有所在的表名和字段名.在实现运算符重载前还是把基础功能用函数实现,运算符重载方法简单调用就OK了.
?
大体上描述几个方法实现就行了,对于其他实现原理一样.下面开始运算重载部分
?
到这里工作算是完成了,不过好象少了点什么东西似的...似乎没有实现&和|;因为这两个运算不是比较运算符所以不是FieldInfo对象实现的.以上代码中每个比较运算都返回了一个Expression对象,那&和|自然就由它来实现了
?
对于以上完整代码可以从https://smarkdata.svn.codeplex.com/svn/Smark/Smark.Data/Smark.Data/Expression.cs获取
实现代码的都完成的,那看一下分别在不同查询的情况下是什么效果:
sql:
select * from customer where region='UK'
c#
(Customer.Region=='UK').List<Customer>()
sql:
select * from Orders where OrderDate>'1998-7-8' and OrderDate <' 1998-8-8'
c#
(Order.OrderDate >"1998-7-8" & Order.OrderDate<"1998-8-8").List<Orders>()
sql:
select * from Orders where CustomerID in('2','5','6')
c#
(Orders.CustomerID ==new []{"2","5","6"}).List<Orders>();
sql:
select * from Orders where CustomerID in(select customerid from customer where region='UK')
c#
(Orders.CustomerID==Customer.CustomerID[Customer.Region=="UK"]).List<Orders>();
从以上代码可以看出由于自己重载所以自由度很高,对于==这个运算符可以代替很多SQL的比较操作如:=,in,in(select)等,当然还可以发挥编写者了想象力.
由于是自定义编写实现,那条件动态组合当然要比Linq所灵活很多:
?
看上去还是挺多的,应该能满SQL对应的需要,首先整理出一个对应关系
c# SQL
== =
!= <>
> >
>= >=
< <
<= <=
& and
| or
总得来说基础的已经差不多了,但决少like,in等,这些可以使用函数或一技巧上的转换实现.
既然实现运算符重载,那当然就要重建一个对象做他基础实现,其作用就是类似于SQL中的字段.
?
?
?
?
实现代码的都完成的,那看一下分别在不同查询的情况下是什么效果:
sql:
select * from customer where region='UK'
c#
(Customer.Region=='UK').List<Customer>()
sql:
select * from Orders where OrderDate>'1998-7-8' and OrderDate <' 1998-8-8'
c#
(Order.OrderDate >"1998-7-8" & Order.OrderDate<"1998-8-8").List<Orders>()
sql:
select * from Orders where CustomerID in('2','5','6')
c#
(Orders.CustomerID ==new []{"2","5","6"}).List<Orders>();
sql:
select * from Orders where CustomerID in(select customerid from customer where region='UK')
c#
(Orders.CustomerID==Customer.CustomerID[Customer.Region=="UK"]).List<Orders>();
从以上代码可以看出由于自己重载所以自由度很高,对于==这个运算符可以代替很多SQL的比较操作如:=,in,in(select)等,当然还可以发挥编写者了想象力.
由于是自定义编写实现,那条件动态组合当然要比Linq所灵活很多:
?
相关文章推荐
- C#运算符重载实现动太SQL生成
- C#实现Excel动态生成PivotTable
- C#实现登陆验证码图片的动态生成
- C#实现动态生成Word
- C#中"对于多个基表不支持动态SQL生成"的错误原因
- 数据库数据导入导出系列之五 C#实现动态生成Word(转)
- C#实现动态生成静态页面的类详解
- C#编程实现动态生成Word文档
- C# 动态生成Excel,可实现冻结窗口等其他Excel扩展
- c# 动态生成继承类并实现序列化特性
- (转)C#编程实现动态生成Word文档
- Jdbc模板,实现动态生成SQL...
- C#编程实现动态生成Word文档
- C# 实现 Aop [Emit动态生成代理类方式]
- (fujie724) C#:简单实现动态数据生成Word文档并保存
- C#编程实现动态生成word文档
- C#实现DataGrid(GridView)动态生成列
- C#_以SQLDataReader为数据源,实现TreeView与ListView之间的动态绑定
- DB2存储过程实现查询表数据,生成动态SQL,并执行
- C#实现动态生成Word