热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

浅谈LinqToSql集成数据库语言的优劣

LinqToSql是Microsoft开发的针对解决data!=object标题的新技巧。在笔者的一系列的文章中,对它已经做了大批的先容。现在,笔者将从经验的角度,谈谈它的优劣。1、LinqToSql的长处在Li

Linq To Sql是Microsoft开发的针对解决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实现的快很多。

结论:各种技巧都有其自身的长处和毛病。应用什么样的技巧,完整在于项目对性能和开发进度的请求,以及程序员自身的爱好有关。扬长避短,才是正道。

推荐阅读
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
  • 本文介绍如何在 Unity 的 XML 配置文件中,将参数传递给自定义生命周期管理器的构造函数。我们将详细探讨 CustomLifetimeManager 类的实现及其配置方法。 ... [详细]
  • SQLite 动态创建多个表的需求在网络上有不少讨论,但很少有详细的解决方案。本文将介绍如何在 Qt 环境中使用 QString 类轻松实现 SQLite 表的动态创建,并提供详细的步骤和示例代码。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 本文探讨了在Windows Server 2008环境下配置Tomcat使用80端口时遇到的问题,包括端口被占用、多项目访问失败等,并提供详细的解决方法和配置建议。 ... [详细]
  • 本文介绍了多个关于JavaScript的书籍资源、实用工具和编程实例,涵盖从入门到进阶的各个阶段,帮助读者全面提升JavaScript编程能力。 ... [详细]
  • 分享一个简化版的Silverlight链接图项目:Link Map Simplified
    本文介绍了一个使用Silverlight开发的可视化工具,主要用于展示和操作复杂的实体关系图(Graph)。该工具在犯罪调查系统中得到了广泛应用,帮助用户直观地获取和理解相关信息。 ... [详细]
  • 探讨如何从数据库中按分组获取最大N条记录的方法,并分享新年祝福。本文提供多种解决方案,适用于不同数据库系统,如MySQL、Oracle等。 ... [详细]
  • 本文介绍了如何在C#应用程序中有效隐藏SQLCMD命令行窗口,确保程序运行时不会弹出黑色命令提示符窗口。 ... [详细]
  • 本文详细介绍了 iBatis.NET 中的 Iterate 元素,它用于遍历集合并重复生成每个项目的主体内容。通过该元素,可以实现类似于 foreach 的功能,尽管 iBatis.NET 并未直接提供 foreach 标签。 ... [详细]
author-avatar
liuc
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有