前两星期,因为项目的需要,静下心来读完了《Pro.LINQ.Language.Integrated.Query.in.Csharp.2008》的 linq to object 和 linq to Sql 部分,希望能将Linq to Sql 应用在我们的项目中。读完后,颇有些心得,也深感到 Linq to Sql 的不足。

这里我不讨论Linq的基本语法,也不讨论怎么用 Linq to Sql 来对数据库做SIUD操作,关于这方面的文章,网上已经有很多了。这里主要谈Linq to Sql的不足之处。

不足1:规则太死,可扩展性少
    这里说的规则太死,主要指业务层实体与数据库表的绑定。基本上只能是一个实体对象对应于一个表,而且,对实体对象的要求太多,比如,(1)该实体对象必须要有默认无参构造方法(如果没有也会编译通过,但无法运行,因为Linq to Sql是通过反射来构造对象,而且用的是该对象的无参构造方法);(2)该实体的所有实体存储字段都不能有readonly关键字(反射要对该字段写值);(3)如果该实体存在对子对象(“一对多”关系的“多”一方的实体对象)的一个列表,则该列表必须是EntitySet<T>类型;(4)如果该实体有对父对象(“一对多”关系的“一”一方的实体对象)的引用,则该应用类型必须是EntityRef<T>类型,而且还要有相对于父对象主键这样的字段存在。所有这些规则,注定了业务层实体对象基本没有办法自己来手写以进行自定义,进行扩展。那有人说了,本来就没让你手写,有SqlMetal和可视化设计工具存在,还手写,吃饱了撑着。我同意这些工具确实非常有用,但是这些工具生成的实体满足我们业务的需要吗?因为业务的变化是多样的,而过多的条条框框却大大缚束了我们的手脚。

不足2:不支持TimeSpan
    真是不可思议,实体类的TimeSpan字段怎么都没法直接映射到Sql Server的列中去(也许我没找对方法,若大家有办法,欢迎告知)。怎么办?难道要变通一下。是可以变通,而且变通的办法很多,但是,这种基本的类型都要变通才能实现,难道说这是一个足够成熟足够强大的框架所应该展现给大家看的吗?

不足3:透明性不够,使用上有困难
    我在看书之前,曾写过这样的代码,如下:
            using (ProgramConsoleDataContext db = new ProgramConsoleDataContext())
            {
                BaseTask baseTask = new BaseTask()
                {
                    Name = "jhh",
                };

db.BaseTasks.Attach(baseTask);
                db.SubmitChanges();
            }
    结果运行失败,当然我现在知道为什么失败,但这也暴露了一个问题,就是使用者在使用Linq to Sql时,必须清楚DataContext对象的内部运作方式。看到Table<T>的“InsertOnSubmit”与“DeleteOnSubmit”这样的方法,就足以说明其封装性不够这样的问题。实际上,“InsertOnSubmit”原来设计的名字叫“Add”,“DeleteOnSubmit”原来的名字叫“Remove”,请问,你是喜欢后面的名字还是前面的名字,是喜欢后面的封装还是前面的封装?估计原来Linq to Sql设计团队的目标是提供一个封装性更强的框架,但后面因为种种原因没有实现,于是退而求其次,但怕大家误解“Add”与“Remove”这样方法,于是改成现在的名字,以强调“Submit”的概念(纯属个人猜测)。
    DataContext所提供的实体变更跟踪功能是一大亮点,但使用上感觉不是很方便,也许是我没找到好的运用模式。我在想,我是该永久保存该对象的一个引用呢,还是用到一次建一次对象。如果采用第一种方法,那么我的程序将随着运行时间的增长而Load越来越多的数据,最后,可能整个数据库都在Load进来;那如果采用第二种方法,那么我怎么利用它提供的实体变更跟踪功能呢?当然,可以使用Table<T>的Attach方法,但我不是每次都知道UpdateMode的方式,而且,要是我要Attach的这个对象是个大对象呢,下面挂了很多的EntitySet呢,我又该怎么Attach?我思考了很久,没有找到答案。

不足4:性能问题
    这个就不用说了,通过反射来实现的,当然有损失,也能接受,现在的ORM有不损失性能的吗?所以,这个可以说是问题,也可以说不是问题,大家都能理解。但是,DataContext的实体变更跟踪的实现,却又是以性能、空间来换取的。不信你试试,在DataContext中Retrieve一个实体,然后更改该实体,你看看你的实体构造方法被调用了几次?是不是两次?为什么?因为Retrieve时一次,更改该实体时又一次,因为DataContext保存了该实体的原始副本。本来,我听说,在实体中实现INotifyPropertyChanging与INotifyPropertyChanged这两个接口后,DataContext就能根据该接口提供的功能来进行实体变更跟踪,我想,这样就不会创建一个副本了吧,结果发现还是建了一个副本,这是为什么?不知道。

我还没有用Linq to Sql做过项目,因此以上的看法可能都不是很成熟。实际上,我想,Linq to Sql本来的定位就不是面向企业级运用的,我们也不要对它要求太多,实际上,简单就是它最大的美。我认为它适合于做一些比较简单的、业务逻辑不复杂的项目,但不适合做大的项目,我甚至认为中型的项目也不适合用它来做。目前Ado.net Entity Framework已经bate3了,期待它带来的Linq to entities能带给我们惊喜。

最后,提出一个疑问:ORM真的有大的前景吗?大规模的项目有用ORM的吗?什么时候会有成熟的面向对象的数据库产品,或者因为关系模型在数学上的优美性而永远不会有呢?

转载于:https://www.cnblogs.com/jhh0111/archive/2008/07/01/1233350.html

浅谈Linq to Sql 的不足相关推荐

  1. 浅谈LINQ to SQL集成数据库语言优劣

    Linq To SQL是Microsoft开发的针对解决data!=object问题的新技术.在笔者的一系列的文章中,对它已经做了大量的介绍.现在,笔者将从经验的角度,谈谈它的优劣. 1.LINQ t ...

  2. 浅谈Linq to SQL中的模式

    学习Linq to SQL也有一段时间了,感叹它做为ORM虽然简单但是功能效率都还不错,从编译器和语言层面支持上来看,它是其他ORM工具不能比的.Linq to SQL中运用了很多模式对自身的效率进行 ...

  3. boolean mybatis_浅谈mybatis中SQL语句给boolean类型赋值问题

    我就废话不多说了,大家还是直接看代码吧~ SELECT m.menu_id , m.parent_id , m.`name` , 1 opens FROM menu m WHERE m.is_vali ...

  4. sql的四种连接 用mysql的语句写_170221、浅谈mysql的SQL的四种连接

    例子: ------------------------------------------------- a表     id   name     b表     id   job   parent_ ...

  5. mysql sql优化_浅谈mysql中sql优化

    说到sql优化,一般有几个步骤呢,在网上看到了一篇很不错的帖子.在这分享一下吧,也是自己学习的一个过程. 一.查找慢查询 1.1.查看SQL执行频率 SHOW STATUS LIKE 'Com_%'; ...

  6. ERP浅谈之报表SQL简述

    昨天刚刚独立完成了一次月销售增长分析报表,发现了很多问题和方法,觉得很有必要来记录一下. 首先贴一下代码: /*dialect*/ select Fnumber,FName_l2,sum(NowFQt ...

  7. Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的差别

    在上面一篇文章Linq To Sql进阶系列(六)中,我们提到了使用object的动态查询.本文在上文的基础上,再做更加深入的引申.同时修正上文中一些不妥的地方. 1, object的动态查询续 首先 ...

  8. 浅谈SQL注入风险 - 一个Login拿下Server(转)

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:"老师你这SQL有注 ...

  9. 浅谈SQL Server内部运行机制

    原文:浅谈SQL Server内部运行机制 对于已经很熟悉T-SQL的读者,或者对于较专业的DBA来说,逻辑的增删改查,或者较复杂的SQL语句,都是非常简单的,不存在任何挑战,不值得一提,那么,SQL ...

最新文章

  1. 工作流笔记第一天_简单介绍activiti
  2. 惠普z840工作站linux,HP Z840 工作站,高清非编工作站
  3. Javaweb编程中的乱码问题
  4. Reuse library debug in Chrome - phase2 handle success response (2)
  5. Jexus支持HTTPS协议
  6. css 文字重叠_html网页文字重叠 字体叠加显示css如何解决
  7. 嘉峪关计算机网络优化,嘉峪关广播电视大学计算机网络技术专业_甘肃报名_网络教育计算机网络技术专业教学计划_中国教育在线...
  8. WPF 之 鼠标双击事件
  9. 【算法笔记】数论基础:康托展开(全排列和序号之间的映射)
  10. [索引汇总帖] 【eoeAndroid社区索引】Cocos2d-x部分汇总 [转贴]
  11. Java实现进制转换方法汇总
  12. html吃豆豆小游戏源码,HTML5 Canvas吃豆豆动画
  13. 风变编程python课_聊一聊风变编程Python线上课程
  14. [转] Redefining the shading languages ecosystem with SPIR-V
  15. 自己制作Chrome便携版实现多版本共存
  16. js如何截取某个字符串前面所有的字符串
  17. 推荐一个单干网赚好站!BUXJOB - 生活至上,美容至尚!
  18. NodeJs股票查询应用
  19. 高内聚 松耦合 高扇入 低扇出
  20. 手把手教你开发第一个HarmonyOS (鸿蒙)移动应用

热门文章

  1. 把握初期企业的发展战略规划
  2. Windows Azure 社区新闻综述(#78 版)
  3. FusionChart 保存图片
  4. 升级到只读域控制器RODC
  5. linux gdb 寄存器,x86 调试寄存器
  6. datagridview列 值提取_提取符合条件的多个记录,VLOOKUP:盘他!
  7. Android FrameWork——PackageManager框架
  8. linux C/C++内存检测
  9. 如何获取InnoDB树的高度
  10. devstack安装openstack