posts - 34, comments - 2158, trackbacks - 1, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理


很多时候事物要从外部去看才能看清本质。在掌握了许多非微软的技术后,你才能够看清微软技术的优点和缺点
我使用linq to sql 6个月,最后放弃。

linq to sql 的问题在哪里呢?
立场错了,它放弃了数据库无关性,也许有人会说我就是只用Sql Server,不跨数据库有什么关系呢?
关系太大了。因为不跨数据库这个基本前提, 极大的影响了linq to sql的spec的成形。在这个前提下,原来通不过的spec就有可能被通过(这是对微软的PM经理来说的)。碰到困难,最终都有机会推给存储过程,或者sql 拼接。于是,ORM的一些基本技术指标也就无法达到了。结果就是linq语法是不完备的,很多事情做不到,或者做起来非常麻烦。
在使用linq to sql的时候,你就会抵抗不住使用sp或者sql拼接的诱惑
也就是说, 微软项目经理用一个错误的思想,做了一个错误的项目, 最后被他自己也有可能是其他项目经理所终结。
其实微软的工程师也是人,也要养家糊口,也会应付上司。不用太迷信。
结论:
ORM必须是跨平台的, 这是一个基本立场。有了这个基本立场,你才能做出一个真正有意义的ORM,因为只要一跨平台, 设计和spec就会发生根本性变化。
这个可以参考Jquery的基本思想。

EF按照它的spec它是跨数据库,然而, 它让我想到了什么呢? 呵呵, 令无数人发指的java Entity Bean,难道历史总是喜欢轮回。
期待高手比较一下Entity Framework和java Entity Bean的优缺点。

Feedback

#1楼  回复 引用 查看   

2009-01-05 12:17 by Jerry Qian      
沙发啊啊。

#2楼  回复 引用   

2009-01-05 12:23 by 未上线的蒙蒙[未注册用户]
有微软的员工么???发表下意见和建议啊!
怎么制造商人呢?光有用户在这琢磨!

#3楼  回复 引用   

2009-01-05 12:23 by winter-cn未登陆[未注册用户]
我想问问 到底这消息是在哪传出来的?
我现在没有看到任何官方声明或者内部消息

#4楼  回复 引用   

2009-01-05 12:24 by 3361[未注册用户]
我刚准备开始它就over了
没有享受到风口浪尖上的快乐和代价...

#5楼  回复 引用   

2009-01-05 12:27 by 豆芽菜[未注册用户]
你不学没人让你学,整个假消息(我到现在还没看到官方)这么多跟风的!
自己大脑有没有想过!

#6楼  回复 引用 查看   

2009-01-05 12:33 by brightwang      
--在使用linq to sql的时候,你就会抵抗不住使用sp或者sql拼接的诱惑
这句话够愚蠢,我用了2个项目后怎么就没有这种诱惑。这篇文章可以移出首页了。

#7楼[楼主]  回复 引用 查看   

2009-01-05 12:39 by 栖山      

--引用--------------------------------------------------
brightwang: --在使用linq to sql的时候,你就会抵抗不住使用sp或者sql拼接的诱惑

这句话够愚蠢,我用了2个项目后怎么就没有这种诱惑。这篇文章可以移出首页了。
--------------------------------------------------------
你做的是不是毕业设计?呵呵

#8楼  回复 引用 查看   

2009-01-05 12:40 by 冀中      
不管linq to sql 是否被废弃,应该努力掌握sql,这个起码几十年内不会变化。

#9楼  回复 引用   

2009-01-05 12:44 by 789[未注册用户]
@brightwang
您用的是哪种ORM框架??

#10楼  回复 引用 查看   

2009-01-05 12:49 by brightwang      
--引用--------------------------------------------------
栖山:
--引用--------------------------------------------------
brightwang: --在使用linq to sql的时候,你就会抵抗不住使用sp或者sql拼接的诱惑

这句话够愚蠢,我用了2个项目后怎么就没有这种诱惑。这篇文章可以移出首页了。
--------------------------------------------------------
你做的是不是毕业设计?呵呵
--------------------------------------------------------
当然不是,你以为人人都跟你一样信口雌黄,如果按你一厢情愿的想法,是不是应该说用hibernate的hql后,大家都禁不住诱惑都用sql。结果是这样吗?
你到底调查过几个人啊,是你自己在这里YY吧。

#11楼[楼主]  回复 引用 查看   

2009-01-05 12:50 by 栖山      
冀中: 不管linq to sql 是否被废弃,应该努力掌握sql,这个起码几十年内不会变化。
--------------------------------------------------------
我的看法是,随着内存价格的继续下降,Cluster+Cache+虚拟机+多核+网络化存储会最终淘汰传统的数据库技术,Saas和Clound加MID(移动化互联网设备)会成为主流,应该不会超过10年

#12楼  回复 引用 查看   

2009-01-05 12:56 by Terry Sun      
不能为了ORM就认为linq to sql该放弃,这种思想太禁锢

#13楼  回复 引用   

2009-01-05 12:59 by ---------------[未注册用户]
--引用--------------------------------------------------
栖山: 冀中: 不管linq to sql 是否被废弃,应该努力掌握sql,这个起码几十年内不会变化。
--------------------------------------------------------
我的看法是,随着内存价格的继续下降,Cluster+Cache+虚拟机+多核+网络化存储会最终淘汰传统的数据库技术,Saas和Clound加MID(移动化互联网设备)会成为主流,应该不会超过10年
--------------------------------------------------------
这话说得太小白了

#14楼  回复 引用   

2009-01-05 13:12 by about[未注册用户]
兰州烧饼

#15楼  回复 引用   

2009-01-05 13:14 by 匿名[未注册用户]
如果仅仅因为跨平台的原因要枪毙Linq to sql就太片面了,不可能用.net总是做企业应用,做大项目吧,事实上小型的项目更多。
就目前应用而言,linq to sql最大的毛病在于它的设计器,太不好用了,到了VS2008SP1里也没什么改进。

#16楼  回复 引用 查看   

2009-01-05 13:20 by Jeffrey Zhao      
为什么不垮数据库就不能ORM了?为什么Linq语法是不完备的?LINQ还是LINQ to SQL?为什么“ORM基本指标不符合”导致了“LINQ语法不完备”?LINQ关ORM什么事情?
有些是值得讨论的问题,但是不要一句话点评。

#17楼  回复 引用 查看   

2009-01-05 13:26 by Jason.Wei      
又见“LINQ"灭亡贴!

#18楼  回复 引用 查看   

2009-01-05 13:30 by 一刀刘-刘玉磊      

#19楼  回复 引用 查看   

2009-01-05 13:34 by Bēniaǒ      
李老的这篇文章很有阅读的价值"不得不为LINQ说几句话,驳“LINQ已死”论"
http://www.cnblogs.com/Terrylee/archive/2009/01/05/linq-and-linq-to-sql.html

-----------------------------------------------------------------
EF按照它的spec它是跨数据库,然而, 它让我想到了什么呢? 呵呵, 令无数人发指的java Entity Bean,难道历史总是喜欢轮回。
期待高手比较一下Entity Framework和java Entity Bean的优缺点。
-----------------------------------------------------------------
我想问下LZ,为什么你要去和EJB进行比较呢????不会是偏爱Java吧??我吓说的.

EJB中的Entity Bean确实有很多优点我们可以借鉴,尤其是在EJB3.0中,基于JPA的Entyty Bean开发,还支持Hibernate.但是请LZ在某某某些方面还是区分开好.

为什么EJB叫重量级企业框架呢???重量级代表着什么?
虽然EJB3.0与之前的版本比,经过了一场革命性的突破.MS的东西也不是吃素长出来的...... 扯远了...

#20楼  回复 引用 查看   

2009-01-05 13:39 by 沐枫      
其实,Linq2Sql也好,EF也好,其实都是一样的,都是vs的一个可选件,都是用代码生成器生成的。

最终,我们可以为vs增加更多的类似Linq2Sql(dbmx)或EF(edmx),和mymx, yourmx, theirmx...

根本上,它们并没有存在有特别的非此即彼的状况。 BTW: LINQ本身来说,只是.net语言机制的一部份,做为语法,只要这种语言还在用,就不存在死不死的问题。 linq2sql/lin2xml/linq2EF,乃至于linq2xxxx,都是基于LINQ规范扩展出来的应用而已。

#21楼[楼主]  回复 引用 查看   

2009-01-05 13:42 by 栖山      
@Jeffrey Zhao

1,为什么不垮数据库就不能ORM了?
不跨数据库就不能做出一个完备的ORM, 这是一个完成度的问题
2,为什么Linq语法是不完备的?LINQ还是LINQ to SQL?
这里说的是linq to Sql,简单的说,就是一个相对复杂的查询用linq to sql写的话,不是写不出来,就是写了老半天,编译还是通不过。
3,为什么“ORM基本指标不符合”导致了“LINQ语法不完备”?
因为如果是基于数据库无关的, 你没有机会推给sp,因为sp是数据库相关,所以逼得你把ORM做得相对完备,这是一个软件工程的问题。
4,LINQ关ORM什么事情?
linq 和ORM没有关系, 本文只讨论linq to sql (不过linq并非是一种好的技术方向,DSL技术才是正确的方向,可以在另外的文章讨论)
最后很想听听你对EF的看法

#22楼  回复 引用 查看   

2009-01-05 13:43 by 丁学      
坐在墙上看,决定不发言

#23楼  回复 引用 查看   

2009-01-05 13:47 by YAO㊣      
不掺乎这些了,看俺的数学去。

#24楼  回复 引用 查看   

2009-01-05 13:51 by Jeffrey Zhao      
@栖山
面向特定数据库的ORM,只能说适用范围不广,不能说不完备,或是ORM功能不好。
我觉得LINQ(to SQL)里的延迟加载特性最适合相对复杂的查询,我的项目中查询非常复杂,用LINQ to SQL写起来非常好。我想这只是使用上的问题吧,要不举个实例?
EF我不了解,不好说,但是我LINQ to SQL用的真是无比爽快。

#25楼  回复 引用 查看   

2009-01-05 13:51 by Windie Chai(笑煞天)      
楼主,这不叫做“放弃了数据库无关性”,TerryLee也说了,Linq2sql只是linq的一个Provider。
为了证明以及演示Provider的能力,微软通常会为某一种技术提供一种实现供开发人员直接使用或者参考。
这样的例子数不胜数,比如WF中的SQL持久性服务,再比如ASP.net中的SQL Membership Provider等等,还有,ADO.net也没有提供对Oracle的支持吧。
作为平台提供者,微软没有必要提供所有的实现,如果微软提供了,要我们做什么?

#26楼  回复 引用   

2009-01-05 13:53 by 前门[未注册用户]
唉,我还是坚持我的Ado.net,效率优先!
唉,我还是坚持我的Ado.net,效率优先!
唉,我还是坚持我的Ado.net,效率优先!
唉,我还是坚持我的Ado.net,效率优先!

#27楼  回复 引用 查看   

2009-01-05 14:00 by Jon.Hong      
@Jeffrey Zhao
linq to sql最大的解放就是查询,,以往的ORM查询都很弱,不过linq to sql还有有些不足的(ado.net framework entity好象也不支持吧),比如不支持sql server2008的hierarchyid,以及空间数据类型。

#28楼[楼主]  回复 引用 查看   

2009-01-05 14:03 by 栖山      
@Jeffrey Zhao

我现在用的ORM可以实现单表继承,多表继承,级联式删除,创建母实体,创建子实体,当然这些功能我也不要求linq to sql拥有。对微软的标准要降低一点。
这是我写过的一个linq
var query = from f in
(from dl in DB.Feeds
where dl.insert_date > System.DateTime.Now.AddDays(-3) && dl.insert_date < System.DateTime.Now.AddDays(3)
orderby dl.update_date descending select dl).Take(5)
group f by f.insert_date.Value.Date into g
orderby g.Key descending
select new
{
DateName = g.Key.Date.ToShortDateString(),
Feeds = from c in g
select new
{ TimeName = c.insert_date.Value.ToShortTimeString(),
c.feed_title,
c.feed_head_line,
c.has_media ,
c.feed_icon,
c.media_content,
c.feed_action
}


};
这个实现了一个feeds的查询,类似facebook的minifeed, 我感觉已经到极限了, 要再加一点商业逻辑就爆了。
或者你贴一个比较复杂的查询让我们学习一下

#29楼  回复 引用   

2009-01-05 14:07 by 我厂制造[未注册用户]
只看出为什么楼主放弃l2s,没看出为什么微软放弃,我也不明白所谓"放弃"到底指什么,至少有某个标志性事件吧才能说l2s已进入被微软放弃状态吧?
至于l2s爽不爽,大家没有共同参照,仅是基于各自处境的不同感受,无法得出统一结论.
倒是楼主说"不过linq并非是一种好的技术方向,DSL技术才是正确的方向",很想听听楼主的看法

#30楼  回复 引用 查看   

2009-01-05 14:10 by kiler      
@栖山
用你的orm把这段查询写出来,看看是否更简单?

#31楼[楼主]  回复 引用 查看   

2009-01-05 14:12 by 栖山      
@Windie Chai(笑煞天)
既然是参考,就可以选择好的来用, 不好的放弃。
一部分人做白老鼠,然后告诉其他人他的体验,免得大家都做白老鼠。
不过如果能把做白老鼠的经验告诉大家,或许会有帮助。
我其实很愿意做白老鼠的,呵呵


#32楼  回复 引用 查看   

2009-01-05 14:13 by Jeffrey Zhao      
@栖山
嗯嗯,我会给出例子的,呵呵。

#33楼  回复 引用   

2009-01-05 14:19 by 刘少侠[未注册用户]
@栖山
不得不笑了!
你这也叫复杂,说什么“感觉已经到极限了,要再加一点商业逻辑就爆了”。
麻烦你用LinqPad查看一下生成的SQL,只能说你,无知!

#34楼[楼主]  回复 引用 查看   

2009-01-05 14:22 by 栖山      
kiler: @栖山
用你的orm把这段查询写出来,看看是否更简单?
--------------------------------------------------------
这个查询只有一张表,而且不包含分页, 如果用sql写是最简单的。
我的第一个直觉就是linq to sql的表现力太弱小了。

#35楼  回复 引用 查看   

2009-01-05 14:27 by Windie Chai(笑煞天)      
@栖山
那也是你放弃,而不是微软放弃啊。

#36楼[楼主]  回复 引用 查看   

2009-01-05 14:38 by 栖山      
刘少侠: @栖山
不得不笑了!
你这也叫复杂,说什么“感觉已经到极限了,要再加一点商业逻辑就爆了”。
麻烦你用LinqPad查看一下生成的SQL,只能说你,无知!

--------------------------------------------------------
这么简单,你能帮我改成server端分页吗?呵呵

#37楼  回复 引用   

2009-01-05 14:40 by #27[未注册用户]
linq慢是慢~
但直观一点~对于维护大量的t代码来说...

#38楼  回复 引用   

2009-01-05 14:46 by 密码打开[未注册用户]
一群没意义的争论,好比我们不知道汽车的构造,纷纷猜测汽车吃的是草还是肉!
一群没意义的争论,好比我们不知道汽车的构造,纷纷猜测汽车吃的是草还是肉!
一群没意义的争论,好比我们不知道汽车的构造,纷纷猜测汽车吃的是草还是肉!
一群没意义的争论,好比我们不知道汽车的构造,纷纷猜测汽车吃的是草还是肉!
一群没意义的争论,好比我们不知道汽车的构造,纷纷猜测汽车吃的是草还是肉!
一群没意义的争论,好比我们不知道汽车的构造,纷纷猜测汽车吃的是草还是肉!
一群没意义的争论,好比我们不知道汽车的构造,纷纷猜测汽车吃的是草还是肉!
一群没意义的争论,好比我们不知道汽车的构造,纷纷猜测汽车吃的是草还是肉!
一群没意义的争论,好比我们不知道汽车的构造,纷纷猜测汽车吃的是草还是肉!
一群没意义的争论,好比我们不知道汽车的构造,纷纷猜测汽车吃的是草还是肉!
一群没意义的争论,好比我们不知道汽车的构造,纷纷猜测汽车吃的是草还是肉!
一群没意义的争论,好比我们不知道汽车的构造,纷纷猜测汽车吃的是草还是肉!

#39楼  回复 引用 查看   

2009-01-05 14:52 by Jeffrey Zhao      
@栖山
--引用--------------------------------------------------
栖山: 这么简单,你能帮我改成server端分页吗?呵呵
--------------------------------------------------------
难道不可以Skip...Take吗?

#40楼[楼主]  回复 引用 查看   

2009-01-05 15:06 by 栖山      
@Jeffrey Zhao
数据都到内存里了,内存消耗就多了,IO也就忙了。碰巧feeds的数据量也是最多的。我希望能在数据库里面实现分页。
呵呵, 只是和那位朋友开个玩笑,高效率的分页本来就不那么好弄的。

辩论就在于各种思想的碰撞,而不在于胜负。

#41楼  回复 引用 查看   

2009-01-05 15:07 by kiler      
@Jeffrey Zhao
--引用--------------------------------------------------
Jeffrey Zhao: @栖山
--引用--------------------------------------------------
栖山: 这么简单,你能帮我改成server端分页吗?呵呵
--------------------------------------------------------
难道不可以Skip...Take吗?
--------------------------------------------------------

如果用sql的话可就不是加个Skip Take这么简单了。

#42楼  回复 引用 查看   

2009-01-05 15:11 by Jeffrey Zhao      
--引用--------------------------------------------------
栖山: @Jeffrey Zhao
数据都到内存里了,内存消耗就多了,IO也就忙了。碰巧feeds的数据量也是最多的。我希望能在数据库里面实现分页。
呵呵, 只是和那位朋友开个玩笑,高效率的分页本来就不那么好弄的。

辩论就在于各种思想的碰撞,而不在于胜负。
--------------------------------------------------------
兄弟,试试看Skip和Take吧,是构造一个SQL去执行的,不在内存里,这点我还是分得清楚的……LINQ Provider解释的是Where...Select...Skip...Take,from...select这种也是被编译器转换成前面那种再解释的。

#43楼[楼主]  回复 引用 查看   

2009-01-05 15:26 by 栖山      
@Jeffrey Zhao
最简单的查询, l2S会做优化,复杂的就不行了
http://forums.microsoft.com/china/ShowPost.aspx?PostID=3839446&SiteID=15
这里有个讨论的帖子。


#44楼  回复 引用   

2009-01-05 15:41 by 2008s[未注册用户]
--引用--------------------------------------------------
前门: 唉,我还是坚持我的Ado.net,效率优先!
唉,我还是坚持我的Ado.net,效率优先!
唉,我还是坚持我的Ado.net,效率优先!
唉,我还是坚持我的Ado.net,效率优先!
--------------------------------------------------------
看你是什么项目了,刚学LINQ2SQL不到一周,感觉挺好用的。

#45楼  回复 引用   

2009-01-05 15:42 by 2008s[未注册用户]
了解下T-SQL的SELECT执行步骤,就不会觉得LINQ2SQL的语法奇怪了。

#46楼  回复 引用 查看   

2009-01-05 15:52 by Jeffrey Zhao      
--引用--------------------------------------------------
栖山: @Jeffrey Zhao
最简单的查询, l2S会做优化,复杂的就不行了
--------------------------------------------------------
其实LINQ to SQL优化不多,基本上是在作翻译而已。很多写法到了SQL Server这一层自然会优化。
没看出什么问题,他的问题在于写法上的顺序,LINQ to SQL还是老老实实翻译,解释的。
再者,他是想当然的从复杂的SQL中觉得性能差,而完全没有考虑SQL Server的优化。具体的说,虽然SQL里SELECT *,但是执行时SQL查询引擎才不会笨笨的全部拿出来——因此看SQL语句没有价值,看查询计划才有意义。

#47楼  回复 引用   

2009-01-05 15:53 by mmkk[未注册用户]
LZ你确认那个复杂查询是正确的?怎么看最终从g中选择的匿名Feeds嵌套类也不会有值...

#48楼  回复 引用 查看   

2009-01-05 15:58 by wwei      
linq就是多此一举

#49楼[楼主]  回复 引用 查看   

2009-01-05 16:18 by 栖山      
--引用--------------------------------------------------
mmkk: LZ你确认那个复杂查询是正确的?怎么看最终从g中选择的匿名Feeds嵌套类也不会有值...
--------------------------------------------------------
是能运行的, 嵌套太多, 说实话我现在也看不懂了。
总之是自连接加group,当初也是花了好多时间才写出来了,里面用到的技巧还是查了很多博客,现在我也忘了是什么了。前后顺序还不能乱,一层一层写。后来我就不折腾了,都改成存储过程了。再后来就放弃了。

#50楼  回复 引用 查看   

2009-01-05 16:54 by 5yplan      
观望。
用的oracle,没怎么用过linq2sql。
用的vs2005,没怎么用过EF。
继续观望。
O-,-O

#51楼  回复 引用   

2009-01-05 16:58 by 南飞雁1[未注册用户]
虽然俺水平很差
但是看了半天,明白了一点

有人是以数据库为主导的,自然看到l2s这样的东东,不论怎么样都会觉得不爽。
有人是以.net为主导的,l2s可以使开发更简化、快捷,自然比较欢迎。

争论其实解决不了问题
技术的趋势就是不停的封装更低级一些的东西
从机器语言-汇编到高级语言,就一直是这个趋势

谁都知道,如果完全用处理器的微代码写,肯定性能最好
可惜现在没人做到而已。

#52楼  回复 引用 查看   

2009-01-05 20:25 by 王立斌      
自从使用了nbear,我就在linq to sql是否该消亡的问题上没有关注过,因为我更喜欢nbear。

#53楼  回复 引用 查看   

2009-01-05 21:30 by 上不了岸的鱼{ttzhang}      
我是来打酱油滴!

#54楼  回复 引用 查看   

2009-04-28 18:18 by 郑州-老猫      
俺来看看,该不该学学Linq

#55楼  回复 引用 查看   

2009-07-23 03:03 by PhiloHu      
有人汗到我了又.
LINQ开始用着是挺方便,基本操作省事,只考虑实现功能的话很好用.不过真正用起来还是有些不爽的地方,如果要满足特定查询的话,我倒正考虑回到ADO了,为了这一点的方便还损失了性能和灵活性...EDM嘛感觉有些复杂了.呵呵,也许是个人似向问题吧.

#56楼  回复 引用   

2009-08-06 19:27 by Whiz[未注册用户]
LZ的文章比较适合无聊时看,想想世界还有这种人,这种感觉令人十分放松。

EF的框架我们已经上了几个商业项目,都是在央企做的,感觉还可以(只是有些统计要用存储过程),复杂的逻辑大概有三五十行Linq to EF吧,但纯粹关注业务令人感觉比存储过程或SQL好多了,毕竟存储过程还需要关注表结构。

之前做的项目一般也有几百个存储过程吧,要修改一个字段的感觉是很痛苦的(Oracle对这个问题好点)。

另外,EF是可以跨数据库的。

#57楼  回复 引用 查看   

2009-10-17 12:25 by DotJam      
linq 不消失就行了,linq to sql 只是一个应用,微软不提供,自然有人能提供,linq to mysql ,to oracle都能提供,要通用的,linq to Entities

#58楼  回复 引用 查看   

2010-09-05 07:21 by 菩提树下的杨过      
跨数据库,就意味着妥协,不能针对特定的数据库进行优化,这其实即是优点也是缺点。

对于.net平台上的数据库开发而言,相信使用SQLServer的项目远远多过其它数据库,所以linq to sql在这方面其实问题并不大(另外,其实第三方的linq to oracle早就有了)

至于楼主所说的linq to sql的种种不好,比如用sp/sql之类,换个角度其实也可能看成优点。

技术是拿来用的,如果为了单纯概念的纯ORM,而放弃很多精华的东西,比如SP,SQL,那还不如用no sql的数据库的呢?

至少我个人从07年底开始用linq to sql到至今,也做过几个中小型项目(单表数据10w以内),尚未发现明显不爽的地方.