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

1、LINQ to SQL的优点

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

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

在LINQ to SQL之前,在Java领域有Hibernate,在net领域有NHibernate技术,来实现object/relational持久和查询服务。那和NHibernate比起来,它又有那些优势呢.第一,影射代码自动生成。VS2008提供了SQLMetal和ORDesigner两个工具来完成此步骤。而在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换成小写的,一跑过了。莫非真的是列的名字?出个难题吧。找了一个列名,是带空格的,重新来建这个工程.一跑,错了!把列名用中国扩号扩起来了,也是错了。咳,只是动态构造ExpressionTree而已,永远都不能直接接收列的名字。这个例子看着是很简单,可不知道你有没有注意到它有一个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中,你依然可以使用拼接字符串的形式,而不使用它提供的QueryExpression. 它提供了这么两个接口,一个是,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是又如何提升性能的?第一,采用延迟加载(deferredloading)技术。语句是声明了,但是并不立即执行,而是在真正需要的时候才执行。第二,采用缓存技术。已经取到内存的数据,再依次提取时,会先从缓存中返回,而不是再次访问数据库。当然,笔者建议,不要对象的时候,没有必要使用LINQ to SQL.比如,只是填充DataView或DataGrid时,返回dataset或datatable要比用LINQ to SQL实现的快很多。

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

浅谈LINQ to SQL集成数据库语言优劣相关推荐

  1. Linq to Sql: 集成数据库语言查询之一

    Linq to Sql: 集成数据库语言查询之一 2007-09-11 11:30:28 来源:天极yesky 作者:随风流月 带您探索"CRUD "操作-创建,接收,更新与删除, ...

  2. 浅谈Linq to Sql 的不足

    前两星期,因为项目的需要,静下心来读完了<Pro.LINQ.Language.Integrated.Query.in.Csharp.2008>的 linq to object 和 linq ...

  3. 浅谈Linq to SQL中的模式

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

  4. 转载:LINQ to SQL更新数据库操作

    翻译整理ScottGu的关于LINQ to SQL的Part 4: Updating our Database .该Post讲解了如何使用LINQ to SQL更新数据库,以及如何整合业务逻辑和自定义 ...

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

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

  6. 艾伟_转载:使用LINQ to SQL更新数据库(上):问题重重

    在学习LINQ时,我几乎被一个困难所击倒,这就是你从标题中看到的更新数据库的操作.下面我就一步步带你走入这泥潭,请准备好砖头和口水,Follow me. 从最简单的情况入手 我们以Northwind数 ...

  7. Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客  QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...

  8. 艾伟_转载:使用LINQ to SQL更新数据库(中):几种解决方案

    在前一篇文章中,我提出了在使用LINQ to SQL进行更新操作时可能会遇到的几种问题.其实这并不是我一个人遇到的问题,当我在互联网上寻找答案时,我发现很多人都对这个话题发表过类似文章.但另我无法满足 ...

  9. python文本框与数据库的关联_Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理...

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客 QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3. ...

最新文章

  1. su mysql bash 4.1_故障案例: 进入到心创建的用户中,系统会提示-bash-4.1$,请问如何解决?...
  2. java自考真题_自考04747JAVA语言程序设计(一)历年真题试卷下载
  3. linux 中mmap的用法
  4. javascript 的面向对象特性参考
  5. 高清的GIF表情包如何制作
  6. 约束理论学习随笔(2)---DBR系统
  7. 封条格式用word怎么打_大门封条格式用word怎么打
  8. asp.net mvc jquery ajax post,使用ASP.NET MVC在JS文件中设置jQuery的ajax url
  9. 苹果公司透露Siri新发音引擎的内部原理
  10. mysql storage_mySQL__storage课堂笔记和练习
  11. 如何利用Callgraph生成函数调用图?
  12. win10开发java_win10系统搭建Java开发环境的操作方法
  13. vue获取当前月最后一天_只争朝夕,不负韶华——站在2020年第一天,回望2019最后的两个月...
  14. Linux进阶之路————远程登录与vim编辑器
  15. python常用开放工具_python学习笔记16-各种模块和开放工具收集整理
  16. Android通过包名启动应用程序
  17. 单片机编程语言——C语言(2)
  18. 计算机菜单命令后省略号,windows菜单命令项的右边有省略号…表 – 手机爱问
  19. FX5U MODBUS_TCP通讯
  20. IDV和VDI,桌面虚拟化对比

热门文章

  1. flask-sqlalchemy分表解决方案
  2. JQuery中trim函数的具体实现代码
  3. 请wince驱动调试助手的作者sunrain_hjb以及wince开发者进来看看
  4. SQL2005 学记笔记(9)
  5. 文档转换乱码异常解决:unoconv openoffice libreoffice
  6. Jeecg-Boot使用war包在Tomcat中部署之参考教程
  7. 容器编排技术 -- Kubernetes Pod概述
  8. Hibernate命名查询示例 - @NamedQuery
  9. Java中高级面试题 -- 数十道题含答案
  10. DataGrip汉化方法