没有问题,散分:介绍我们是如何为程序插上Linq的翅膀的?!

以专业开发人员为伍 2008-05-18 03:11:59
加精
这里是我对面向对象数据库的接口定义:

public interface IDomain : IDisposable
{
void Save(object obj); //更新和新增是同一个方法。
void Delete(object obj);
void Commit();
void Rollback();
IEnumerable<T> Cast<T>();
}

当然其实现方法应该尽量满足我在另一个帖子中的描述

例如我们要创建一个系统用户,同时把它注册到“出差不报销”和“干活不拿钱”两个用户组里边,我们可以写:

using(var x=new Domain(服务器的Endpoint))
{
var newUser=new User{Name="张三", Password="adfadf", Email="zhang@hotmail.worldcomputer};
var userGroups=from Group g in x where g.Name=="出差不报销" || g.Name=="干活不拿钱" select g;
userGroup.Foreach(g=>
{
g.AddUser(newUser);
x.Save(g);
});
x.Commit();
}

由于面向对象的ORM应该自动保存缓冲区中的所有“脏”对象,因此我们并不需要保存那个newUser,保存(更新)Group就自动保存了newUser。

在IDomain这里,实际上只有Cast是新的(相对于数据库历史而言),是Linq给我们带来的优雅的查询方案。如果我的数据库存储是DataTable,那么我只要在一个static class中这样写一个扩展方法:

static public IEnumable<T> Cast<T>(this DataTable tbl) where T:User
{
var ret=new List<User>();
foreach(DataRow r in tbl.rows)
ret.Add(new User{Name=r["name"],Email=r["email"],Password=r["password"]});
return ret;
}

这样就可以在任何地方写查询:

DataTable tbl= myDataSets.Table["users"];
var query=from User u in tbl where u.Name=="张三" select u;

我在IDomain接口中的仅仅Cast这一个定义,类似于上面我们对保存有User类对象的DataTable追加一个Cast方法的做法,对于你的任何原先的数据库设计只要增加这一个方法,就跟Linq“挂上了钩”,可以享受到Linq的功能了。当然,如果你觉得我写的DataTable的Cast方法效率不高,可以再使用QueryProvider的概念去重新设计Cast(例如返回一个IQueryable<T>类型的结果),使得query自己在运行时编译自己的查询规划步骤。但是无论如何,Linq是非常容易使人对任何“旧的”数据管理程序中的查询进行翻新的。不是只有linq to sql之类现成的那几个类库才用到了Linq,我们从自己的“旧的”数据管理程序出发去扩展出Cast,就能用Linq处理旧的程序对象了。将旧的对象类型,看起来完全不可能为了查询语法改变而重写一边的业务类型,很轻便地利用Linq处理,这才是Linq的最激动人心的地方!
...全文
2318 203 打赏 收藏 转发到动态 举报
写回复
用AI写文章
203 条回复
切换为时间正序
请发表友善的回复…
发表回复
fesly 2011-03-28
  • 打赏
  • 举报
回复
qj64699916 2010-07-02
  • 打赏
  • 举报
回复
mark,学习一下
yezie 2009-04-12
  • 打赏
  • 举报
回复
Cast超级好用,还有oftype
zhifeng_wang 2009-04-09
  • 打赏
  • 举报
回复
学习ing
li_dao_hang_1989 2009-04-03
  • 打赏
  • 举报
回复
学习最好的方法解决问题……
呵呵……
学习中(asp.net交流群83847699)
dengmingcai 2009-04-02
  • 打赏
  • 举报
回复
学习,但看不懂。会努力的。
cadust 2009-03-23
  • 打赏
  • 举报
回复
VS2008 downloading...
wxjian521 2009-03-23
  • 打赏
  • 举报
回复
学习
Feiin 2008-08-07
  • 打赏
  • 举报
回复
收藏
bad1050293 2008-08-05
  • 打赏
  • 举报
回复
jf
themaninwind 2008-08-04
  • 打赏
  • 举报
回复
学习
a85974277 2008-08-04
  • 打赏
  • 举报
回复
哇,传说中3.5新出的Ling,踩下,等学到再研究。哈
gui0605 2008-08-04
  • 打赏
  • 举报
回复
看看
paulin 2008-08-04
  • 打赏
  • 举报
回复
学习~
紫气东来_999 2008-08-04
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 jinjazz 的回复:]
学习
[/Quote]
virusswb 2008-08-04
  • 打赏
  • 举报
回复
又是一篇经典啊,谢谢了
papaya73 2008-08-03
  • 打赏
  • 举报
回复
好啊,向楼主学习!
sxmonsy 2008-08-03
  • 打赏
  • 举报
回复
接分
namhyuk 2008-08-03
  • 打赏
  • 举报
回复
good article
mylibin 2008-08-03
  • 打赏
  • 举报
回复
jf
加载更多回复(182)

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧