日历

« 2008-08-28  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

最新来客

统计信息

  • 访问量: 190
  • 日志数: 2
  • 书签数: 4
  • 建立时间: 2008-01-03
  • 更新时间: 2008-01-29

RSS订阅

自己没事慢慢写

我的最新日志

  • Linq To Sql集成数据库语言的优点和缺点

    2008-1-29

    在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();

      }
    一个更方便的示例:
    以下是引用片段:
    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实现的快很多。

  • 技术人员成功转型的三大要素

    2008-1-03

        有的时候我们对一款产品表现出难以名状的喜爱之情,往往我们就会想像做出这样功能的程序员他应该是多么的伟大,是什么样的天才,对他就如同造物主一般的崇拜,所以很多人会把成为一个程序员作为自己的理想,然而很少有人会知道,在这样一款产品的背后,其实还有一个更加强健的团队在护送着他前行。
        而这个团队的领军人物就是产品经理。近日,我们都很熟悉的暴风影音发布了它最新的3.1版本,这距离上次的3.0版仅过了45天。暴风影音做为一个日使用量在千万级别之上的客户端软件,产品里的任何一个角落有瑕疵,任何一个细节有Bug,被用户识别到的几率非常大,这和普通的应用软件是不能比的。所以需要做大量的用户反馈,数据分析,数据挖掘的工作,来提升软件本身的性能,那么,如果作为暴风影音的产品经理,他的身上又发生着什么样的故事呢?我们带着这样的好奇心采访了暴风影音的产品经理王志鹏。

       王志鹏是一个很健谈的人,但在倾听的时候却很真诚。“也许这就是做一名产品经理所必备的基本素质。”王志鹏对我们的赞赏这样回答道,“判断自己适不适合做一名产品经理,你需要为自己做一个这样的测试,如果有十个人分别提出了十种功能改进的方案,那么你是否能够发自内心的把这十套方案都耐心、认真的听完,并且能够真正领会到他们的意图,即使这其中有不切实际的方案、有令人哭笑不得的方案,但是如果你是有兴趣去做这件事,而且付出的都不会成为你的心理负担,那么你就具备了成为一名产品经理的基本素质”。

    北京印刷网管笔
Open Toolbar