达达's 胡搞瞎搞工作室

此Blog搬到www.unbe.cn/blog 去了,要找我讨论问题请到我的新Blog

DIY 的 LinQ

先要感谢henry提供的很多宝贵意见和经验,让我少走了很多弯路

这几天用泛型运算符重载的办法封装了SQL语句,让C#的代码直接用于数据库查询,有点像C# 3.0里的LinQ,呵呵。
还在不断完善中,先放上来Show一下

像了解泛型运算符重载请看:http://www.cnblogs.com/BG5SBK/archive/2006/07/13/GenericOperatorOverride.html

增:
//Insert Into [Member] ([Code],[JoinTime],[Name],[Password]) values(@P1,@P2,@P3,@P4)
Insert _insert = new Insert(Member.Columns._Table,
    Member.Columns.Code.Set(Guid.NewGuid().ToString()),
    Member.Columns.JoinTime.Set(DateTime.Now),
    Member.Columns.Name.Set(
"xxx"
),
    Member.Columns.Password.Set(CommonCode.HashEncrypt(
"123"0
)));

SqlQuery.DefaultInstance.ExecuteInsert(_insert);

删:
//Delete From [Member] Where [Member].[Name]=@P1 Or [Member].[JoinTime]=@P2
Delete _delete = new Delete(Member.Columns._Table, Member.Columns.Name == "yyy" | Member.Columns.JoinTime == DateTime.Now);
SqlQuery.DefaultInstance.ExecuteDelete(_delete);

改:
//Update Member Set [Name]=@P2 Where [Member].[Name]=@P1
Update _update = new Update(Member.Columns._Table, Member.Columns.Name == "xxx", Member.Columns.Name.Set("yyy"));
SqlQuery.DefaultInstance.ExecuteUpdate(_update);

查:
//Select [Member].* From [Member] Where [Member].[Name]=@P1 And [Member].[Password]=@P2
Select _select = new Select(Member.Columns._Any).From(Member.Columns._Table).Where(
    Member.Columns.Name 
== Member.Columns.Password & Member.Columns.Password ==
 password);

List
<Member> _members = SqlQuery.DefaultInstance.ExecuteList<Member>(_select);

符合查询:
//Select [Member].*, [ToDoList].* From [Member],[ToDoList] Where [Member].[Code]=[ToDoList].[UserCode]
Select _select = new Select(Member.Columns._Any, ToDoList.Columns._Any);
_select.From(Member.Columns._Table, ToDoList.Columns._Table);
_select.Where(Member.Columns.Code 
==
 ToDoList.Columns.UserCode);

System.Data.DataSet _result 
= SqlQuery.DefaultInstance.ExecuteDataSet(_select);

排序查询:
//Select [Member].* From [Member] Order By [Member].[JoinTime] desc
Select _select = new Select(Member.Columns._Any).From(Member.Columns._Table).OrderBy(Member.Columns.JoinTime.Desc);

List
<Member> _members = SqlQuery.DefaultInstance.ExecuteList<Member>(_select);

As支持:
//Select [Table1].[Name] as [UserName] From [Member] as [Table1]
Select _select = new Select(Member.Columns.Name.At("Table1").As("UserName")).From(Member.Columns._Table.As("Table1"));

List
<Member> _members = SqlQuery.DefaultInstance.ExecuteList<Member>(_select);


基本就这些了,呵呵,随便取名叫DIY的 LinQ,大家不要扔石头啊

posted on 2006-07-31 15:31 达达 阅读(2874) 评论(10)  编辑 收藏

Feedback

#1楼 [楼主] 2006-07-31 16:28 达达      

嘿嘿,继续想办法简化接口   回复  引用  查看    

#2楼 [楼主] 2006-07-31 16:32 达达      

嘿嘿,怎么没人发表看法啊,大家一起想想怎么样能让操作更简洁啊,我这个最终是要开放代码的!大家不用担心!!哈哈   回复  引用  查看    

#3楼  2006-07-31 16:39 命运有自己的梦!      

我还是情愿用ActiveRecord,省去了SQL。   回复  引用  查看    

#4楼 [楼主] 2006-07-31 16:45 达达      

@命运有自己的梦!
嘻嘻,没用过那个。。。   回复  引用  查看    

#5楼  2006-07-31 17:55 goodspeed.com.cn [未注册用户]

看起来不错   回复  引用    

#6楼  2006-07-31 21:28 东海风      

有点意思。。。   回复  引用  查看    

#7楼  2006-08-01 00:59 911boy [未注册用户]

要商业应用还是等C# 3.0   回复  引用    

#8楼  2006-08-01 09:05 heweitykc [未注册用户]

又意思,学习一下!   回复  引用    

#9楼  2006-08-01 16:39 OnlyLiu      

越搞越麻烦。本来是标准的SQL,非要搞得和FOXPRO一样。SQL就是需要单独隔离   回复  引用  查看    

#10楼 [楼主] 2006-08-01 17:27 达达      

@OnlyLiu
我认为这和SQL并不冲突,也不是为了完全取代SQL脚本而做这个,它也不能取代SQL脚本的地位。

做这个的目的是尽可能少的在业务层中暴露数据库脚本,以提高程序的可移植性和安全性。

并且这样封装又带来一个好处就是编译时期暴露数据库脚本的错误。

我们知道有时候业务层代码里写了SQL脚本进行比较复杂的业务操作,如果写错了字段或者类型什么的,代码编译时是不会报错的,只有运行到这段代码时才会知道,而使用泛型运算符重载的办法,保持了原有的数据库脚本风格,又可以在编译时期马上知道类型错误或者字段名写错等错误。

以上是针对我DIY的持久层而说,如果你用的是高级的NH或者AR等持久层,它能让你在业务层不SQL脚本,或者编译时期它们也能判断数据库操作错误,那我没什么说的,呵呵,毕竟我只是自己做,跟那种大项目不能比。   回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-07-31 15:44 编辑过


相关链接: