LINQ to Entities统一数据存取方法解析(非原创)
LINQ统一数据存取方法解析
微软面向对象数据存取机制──LINQ,是今年初.NET Framework 3.5中推出的存取技术,新版本更新主要是针对ADO.NET Entity Framework,而推出LINQ to Entities。
LINQ设计的目的是希望解决开发者需要熟悉多种数据存取模式的麻烦。由于开发者需要处理的数据方式越来越复杂,而且混合使用的趋势日益明显。例如应用程序需要存取文件,而文件的Metadata常常是以XML格式描述,再加上应用系统需要以数据库记载人员与权限相关信息。
就这个例子看来,开发者所面对的数据方式,除了结构化的关系型数据,还包括半结构的XML及非结构化的文件和影音文件。
而用以操作这些数据方式的类别对象各有不同:数据库用ADO或ADO.NET;XML用XML DOM(Document Object Model);存取文件用IO。除此之外,查询语法也不一样:存取SQL Server资料用T-SQL;存取XML,用Xpath;存取文件,用类别的属性。因此开发者编写程序时,往往需要熟悉多种数据存取模式。
事实上,无论是关系型数据、XML或文件,有一个共通特征──都是对象集合。
LINQ的出发点,是提供操作对象集合统一的模式,未来只要是集合的对象,都可以利用LINQ统一操作。也就是说,开发者只要熟悉一种语法,就可以操作各种集合对象,背后由.NET Framework根据集合对象的种类,自动产生对应的语法。
这么做的好处,除了.NET Framework可以用多运行绪处理集合,通常会比较有效率之外,也可保有一致性,无论存取XML、数据库、DataSet或文件,所使用的LINQ查询语法是统一的,因此开发者不需要了解什么是XML DOM、T-SQL、DataSet的Method和Property,转而交由LINQ产生对应的语法。
不过目前LINQ存取数据库有一个关键的限制,是现阶段微软只推出LINQ to SQL,而它是针对SQL Server的Provider,而其它数据库的支持,仍待协力厂商开发对应的LINQ Provider。
LINQ结合Entity Framework,可强化本机查询
.NET Framework 3.5 SP1新增的LINQ to Entities,是为了配合ADO.NET Entity Framework,提供存取Entities的能力。
因为ADO.NET Entity Framework必须依赖数据库的查询能力,所以当开发者运行实体查询语言(Entity Query Language),自数据库得到一堆对象暂存于本机内存之后,可以运用LINQ To Entities把数据库回传的结果,作更进一步的新增、删除、修改及查询。
例如ADO.NET Entity Framework取得100笔员工数据实体,若要再找出性别为女的数据,逐笔搜索是比较辛苦的方式,藉助LINQ to Entities就可以直接下条件,筛选出符合的数据。
如何使用ORM
由上面的描述可以得知,LINQ着重的方向,是以统一的方法存取镑类数据方式;而ADO.NET Entity Framework是微软为了结合数据库存取与新式面向对象模型,所推出的ORM解决方案。
不过,针对两者交集的数据库存取部分,适合使用LINQ to SQL或者ADO.NET Entity Framework的时机到底为何?
事实上,LINQ并没有很细致的对应能力,因为它并不是专门用来解决关系型数据库与对象对应的方案,所以针对关系型数据库,它只能做到一对一的对应。
一般看来,由于LINQ to SQL针对对象与数据表的对应,只能做到一对一关系,所以如果要处理一对多或多对多的对应,就只能选择ADO.NET Entity Framework。
负责教授SQL Server的资深讲师胡百敬说:“如果开发者不想面对面向对象化的数据实体,希望了解数据库的结构,则可以选择LINQ to SQL。”
在数据库中的数据表不多的情况下,开发者是可以清楚掌握数据库结构的。但如果是一套ERP,有成千上万个数据表的话,开发者可能会只希望看数据实体,而忽略数据库真正的设计架构,就适合ADO.NET Entity Framework。
但是,未必是越抽象就越好,数据库与面向对象的关联,会衍生出复杂的对应与继承关系,所以企业必须要具备懂得面向对象数据设计的人才,负责处理对象与数据表的对应,开发者才可能只专心在处理商业逻辑的部分。
T-SQL仍是DBA与开发者必学的基础
自从LINQ及ADO.NET Entity Framework问世以来,初学者最常提出的问题就是──到底要学SQL语法?还是LINQ to SQL?还是ADO.NET Entity Framework?
其实.NET开发者确实可以只学LINQ而不管SQL,把所有数据存取的行为通通改用LINQ处理。但是数据库程序开发又有人是负责编写预存程序(Stored Procedure),他们还是必须要学习SQL语法。
严格讲起来,如果有好的ORM解决方案,数据库开发者确实可以不用学SQL。过去的数据库存取确实是很复杂的工作,不过开发者已经习惯了。
虽然T-SQL一点也不面向对象,但是结构化查询语法很接近人类自然语言,非常地简单、易学也易懂,所以开发者不用懂C#、VB.NET等程序语言,光看SQL语法,也猜得出来处理的工作类型。尤其是数据库管理者,如果在SQL Server服务器端,没能善用T-SQL的话,根本无法有效存取。
至于有没有必要跟随微软技术发展的脚步,学习LINQ和ADO.NET Entity Framework?要回归到开发团队在思考数据存取时,是不是使用面向对象的方式。无论LINQ或ADO.NET Entity Framework,都提供能与面向对象模型结合的查询能力。
习惯用对象思考、希望面向对象观念与关系型数据库平顺整合的人,可以尝试学习新的查询语言。如果不是,其实T-SQL也够用的,开发者还是可以用老方法编写数据库存取的应用。