首  页 | 资讯中心 | 网络学院 | 天新汽车 | 天新手机 | 天新游戏 | 软件开发 | 考试认证
品 牌 机 | 笔 记 本 | 服 务 器 | 天新数码 - DC - DV - MP3 - MP4 - GPS - TV | 数字家庭
硬件 DIY - 主板 - CPU - 内 存 - 硬 盘 - 显示器 - 显卡 - 光驱 - 机箱 - 键鼠 - 网络设备
办公设备 | 打 印 机 | 扫 描 仪 | 投 影 仪 | 一 体 机 | 传 真 机 | 路 由 器 | 交 换 机
软件下载 | 驱动下载 | 游戏下载 | 源码下载 | 教程下载 | 站长在线 | 产品中心 | 报价中心
开发首页 | 开发语言 | .Net开发 | Java开发 | Web开发 | 数据库开发 | 移动开发 | 游戏开发 | 企业开发 | 操作系统 | 软件工程
VB VC Delphi PB BCB C++ - ASP.net C# VB.net - J2EE J2SE J2ME EJB - ASP PHP JSP CGI - MSSQL Oracle DB2 MySQL - CodingLife
  数据库开发首页 | 数据库基础 | SQL Server | Oracle | IBM DB2 | Sybase | MySQL/Postgrsql | Access | 数据库问题
  您现在的位置:天新网 > 软件开发 > 数据库开发 > 数据库基础
浅谈Linq To Sql集成数据库语言的优劣
http://dev.21tx.com 2007年09月28日 Tom Song

每日文章精萃
.Net:.NET 数据访问架构指南 Java:Ioc模式解析
ASP:ASP讲座之一:网页开发利器:高效易 PHP:第十一节--重载 -- Classes and Obje
JSP:关于JAVA的分页查询操作技术 CGI:Perl教学(13)Perl的面向对象编程之二
VB:用Visual Basic设计browser及ftp程序 VC:编写基于对话框的应用程序

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

  1、Linq To Sql的优点

  在Linq To Sql推出之前,我们只是把sql语句形成一个string,然后,通过ADO.NET传给SQL Server,返回结果集.这里的缺陷就是,如果你sql语句写的有问题,只有到运行时才知道.而且并不所有的人都懂数据库的。Linq To SQl 在一切围绕数据的项目内都可以使用。特别是在项目中缺少sql server方面的专家时,Linq To SQl的强大的功能可以帮我们快速的完成项目。Linq To SQl的推出,是让大家从烦琐的技术细节中解脱出来,更加关注项目的逻辑。Linq To Sql的出现,大大降低了数据库应用程序开发的门楷,它实质是事先为你构架了数据访问层,势必将加快数据库应用程序的开发进度。Linq To Sql解放了众多程序员,让他们的把更多的精力放到业务逻辑以及code上,而不是数据库。对于初学者来讲,Linq To Sql可以让他们迅速进入数据库应用程序开发领域,节约了培训成本。

  Linq To SQl 的实现,是在ado.net和C#2.0的基础上的。它通过自动翻译sql语句,并把结果集创建成对象并返回。这里我们可以看出,发送到Sql Server端的sql语句是Linq To Sql自动生成的。这对不懂sql的人来说,无疑是个福音。第二,Linq To Sql语句是在编译期间就做检查的。而不是运行时检查。这样,那里出了问题,可以及时更改,而不是到了运行时才发现问题。第三,Linq To Sql是针对对象操作的,更符合今天的oo呼声。

  在Linq To SQl 之前,在Java领域有Hibernate,在net领域有NHibernate技术,来实现object/relational 持久和查询服务。那和NHibernate比起来,它又有那些优势呢.第一,影射代码自动生成。VS2008提供了SqlMetal和OR Designer两个工具来完成此步骤。而在NHibernate中,你不得不自己手工写。第二,影射代码有更多的选择.NHibernate只能把数据库的信息配置在一个XML中,而Linq To Sql有两种方式,一个是放到xml中,我们称为Externl Mapping, 再一种就是以Attribute的形式,存在于各个property中。当然,笔者本人并没有使用过NHibernate,只是从资料上得到这些消息,所以无法给出更多的比较。

  2、Linq To Sql的缺点

  很久前,有个网友问到这么一个问题。他在界面上有个DataView,里面绑定了一些Column,然后他勾选那一列就按某列排序。其传回的参数是列的名字。然后问我该怎么用Dlinq 来实现。

  在以前拼接Sql语句的年代,这个很简单,一个" order by " + string,想按什么排就按什么来排。而现在dlinq是用是一个对象的属性,已经不可能拼接了。我当时给他的答案是这样的。

以下是引用片段:
private void Methods(string orderId)
  {
   var q = db.Customers.Select(c=>c);
  
   switch(orderId)
   {
   case "ID":
   q = q.OrderBy(c=>c.ID);
   break;
   case "Name":
   q = q.OrderBy(c=>c.Name);
   break;
   default:
   break;
   }
  
   var result = q.ToList();
  }

  我那时也没有想出一个更好的方案来。而后告诉他去查下Compiled Query,说不定可以找到更方便的。后来我才在这个例子中,看到更方便的。 

以下是引用片段:
var query =
   db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10).
   OrderBy("CompanyName").
   Select("New(CompanyName as Name, Phone)");

  在这里OrderBy直接接收的就是列的名字。再仔细一看,好像Where里是Linq的语句哎,那OrderBy也该是linq语句。后来,我把CompanyName换成小写的,一跑过了。莫非真的是列的名字?出个难题吧。找了一个列名,是带空格的,重新来建这个工程.一跑,错了!把列名用中国扩号扩起来了,也是错了。咳,只是动态构造Expression Tree而已,永远都不能直接接收列的名字。这个例子看着是很简单,可不知道你有没有注意到它有一个80多k的Dynamic.cs文件。更有意思的事情是,它的名称空间是System.Linq.Dynamic.看样子,ms本来是打算把它加在.net3.5中吗.不晓得为什么放到了例子中了。这个名称空间下,其主要内容就是动态构造Expression Tree. 和Linq To Sql进阶系列(七)动态查询 一文中的方法类似。只是,它还包含了解析字符串部分.

  从上面那个例子中,可以看出,Linq To Sql在这种动态构造语句时,比拼接sql麻烦很多。在Linq To Sql进阶系列(七)动态查询 一文中,笔者极力推荐使用object的查询。这符合Linq To Sql的设计原则。因为,它主要是为了解决data!=objects 的问题而产生的.它所有的操作均针对object,那就让我们使用object的查询吧.

  当然,依然会有人习惯拼接字符串.我并不认为这是个坏毛病。只是有点不符合oo思想而已。事实上,在Linq To Sql中,你依然可以使用拼接字符串的形式,而不使用它提供的Query Expression. 它提供了这么两个接口,一个是,db.ExecuteQuery(string sql); 另一个是,db.ExecuteCommand(string sql);这两个函数都是直接接收 sql语句的.习惯拼接的人,依然可以调用它们来实现你的程序。特别是第一个,其返回的就是一个对象的集合,多少还是有点oo思想的。

  看下面的例子:

以下是引用片段:
var products = db.ExecuteQuery(
   "SELECT [Product List].ProductID, [Product List].ProductName " +
   "FROM Products AS [Product List] " +
   "WHERE [Product List].Discontinued = 0 " +
   "ORDER BY [Product List].ProductName;"
   ).ToList();

  它返回的就是product的集合。而不是什么dataset和datatable之类的。这里,你可以大胆的使用该函数继续拼接你的sql吧,再看下面这个:

以下是引用片段:
db.ExecuteCommand("UPDATE Products SET UnitPrice = UnitPrice + 1.00");

  它在做批处理的时候,你想不用它,都不行.当然,你如果觉得性能不是问题的话,那就用submitchange方法来做更新好了。简单明了的说,Linq To Sql在批处理更新的时候,SubmitChange只会一个个的更新。浪费时间资源.而这个接口,恰好满足了批处理更新或删除的问题。从这两个例子,我们可以看出。没有任何方案是万能的。各有各的优点。

  3、Linq To Sql的性能

  Linq 的性能已经被好多人提及.Linq To Object 的性能大家讨论的比较多些.它确实比自己实现的查找要慢.但是当数据量特别大时,更多是时间是花在分配虚拟内存上了,那么他们的差别就不是那么明显了。Linq To Sql是又如何提升性能的?第一,采用延迟加载(deferred loading)技术。语句是声明了,但是并不立即执行,而是在真正需要的时候才执行。第二,采用缓存技术。已经取到内存的数据,再依次提取时,会先从缓存中返回,而不是再次访问数据库。当然,笔者建议,不要对象的时候,没有必要使用Linq To Sql.比如,只是填充DataView或DataGrid时,返回dataset或datatable要比用Linq To Sql实现的快很多。

  结论:各种技术都有其自身的优点和缺点。使用什么样的技术,完全在于项目对性能和开发进度的要求,以及程序员自身的爱好有关。扬长避短,才是正道。

上一篇: SQL概述For SQL Server Compact Edition
下一篇: 用于挖掘Web日志的数据仓库系统实现

编辑推荐
相关内容
·如何维护SQL Server 2005 CE数据库(非编程
·SQL Server 2005 Compact Edition服务器环
·在DB2上建立database Partition
·Oracle 10g R2特性之数据仓库和集成特性
·SQL Server与Oracle、DB2三种数据库比较
·MySQL查询优化系列讲座之数据类型与效率
·MySQL查询优化系列讲座之查询优化器
·Oracle性能优化系列讲座之技巧篇
·合理选择数据挖掘工具
·利用ASP存取各种常用类型数据库(1)
·分析各种数据库优点 帮你做出准确选择
·如何应用SQL Server DBCC避免堵塞
·Oracle数据库设计开发阶段性能优化策略
·深入浅出SQL之左连接、右连接和全连接
·基于Oracle ADF的应用程序开发
·探讨SQL Server 2005.NET CLR编程
·基于Access数据库的抽奖系统设计
·剖析SQL Server 2005查询通知之基础篇
·在Oracle数据库上构建.NET应用程序
·在Oracle数据库10g中跟踪SQL
最近更新
人气最热
·SQL概述For SQL Server Compact Edition
·用于挖掘Web日志的数据仓库系统实现
·SQL Server Compact Edition启用日志记录
·SQL Server 2005 Compact Edition常见错误
·SQL Server 2005 Compact Edition错误范围
·用SQL Server Compact Edition创建移动应用
·SQL Server 2005 Compact Edition的安全性
·如何维护SQL Server 2005 CE数据库(非编程
·如何收缩SQL Server 2005 Compact Edition
·如何压缩SQL Server 2005 Compact Edition
·原创:在ASP.NET2.0中实现主页嵌套
·DB2 存储过程开发最佳实践
·SQL Server 2005对海量数据处理
·如何恢复/修复MS SQL数据库的MDF文件
·探讨SQL Server 2005.NET CLR编程
·MySQL查询优化系列讲座之数据类型与效率
·SQL Server数据库和XML标识语言的集成
·SQL Server的怪辟:异常与孤立事务
·数据库新手入门之MYSQL出错代码列表
·MySQL是否值得我们选择的正反五个理由

 
·[硬件]隐藏的危险 谈夏季电源的保养与维修
·[数码]小秀一下新买的帝盟Rio 600
·[汽车]5万元以下微型车价格略降
·[开发]asp+中文教程(一)---- -asp+简介、安
·[资讯]百度启动网站评级计划 与Google“争食
·[游戏]名作[向北~DDD~]漫画发售
·[本本]双核DVD刻录 七喜5999元缔造高性价比
·[办公]EIKI推出专业工程机LC-XG300/XG250
·[手机]外媒猛烈抨击!指责M8魅族侵权iPhone
·[考试]评论:各地政府频增公务员新规定 是喜
·[学院]硬盘逻辑锁原理及解决
·[娱乐]打地鼠
 

关于我们 | 联系我们 | 广告服务 | 工作机会 | 版权声明 | 欢迎投稿 | 网站地图
Copyright © 2000-2008 , www.21tx.com , All Rights Reserved .
© 晨新科技 版权所有 Created by TXSite.net