LINQ TO SQL 和 ADO.NET ENTITY 有啥区别呢?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LINQ TO SQL 和 ADO.NET ENTITY 有啥区别呢?相关的知识,希望对你有一定的参考价值。
LINQ to SQL和Entity Framework都是一种包含LINQ功能的对象关系映射技术。他们之间的本质区别在于EF对数据库架构和查询的类型实行了更好的解耦。使用EF,查询的对象不再是完全对应数据库架构的C#类,而是更高层的抽象:Entity Data Model。这提供了额外的灵活性,但是在性能和简单性上面也会有所损失。具体二者之间的区别如下:复杂度:支持越多的特性就会越复杂。LINQ to SQL所支持的特性比较少,所以也就相对不太复杂;而EntityFramework支持的特性比较多,所以相对比较复杂。
模型:LINQ to SQL在数据表与类之间提供了一对一的映射。如果你有Customers,Orders, 和Lineitems表,你就会有Customer,Order, 和Lineitem类来匹配每一个表。EntityFramework可以使你有一个Customer类,而这个类可以匹配多个表。这就意味着公司名可以 在一个表中,但是地址是在另一个表中,而电话号码又在另一个表中,等等。
数据库服务器:LINQ to SQL只支持Microsoft SQL Server 2000及之后的版本,但即使是SQLServer2000也有很多限制。EntityFramework可以支持IBMDB2, Sybase SqlAnywhere, Oracle, SQLAzure,还有其他很多。
开发时间:LINQ to SQL很容易学,开发起来也很快,但是LINQ to SQL有一些限制,在开发较复杂的应用时可能会产生问题。EntityFramework的能力更强,虽然学习及应用起来比较慢,但是对更多的特性的支持使得在开发较复杂的应用时可以使问题最小化。
继承:LINQ to SQL支持TPH,而EntityFramework支持TPH和TPT,并且对TPC也部分支持。
文件类型:LINQ to SQL使用包含XML的数据库标记语言(DBML)文件来映射entity与数据表。EntityFramework 使用四个文件。第一个是Entity Data Model (EDMX),这个是在设计器中使用的。在编译时EDMX文件产生了其他三个文件。另外三个文件中,第一个是ConceptualSchema Definition Language(CSDL)文件,其包含概念模型的XML定义。第二个是SchemaDefinition Language(SSDL)文件,其包含存储模型的定义。第三个文件是Mapping Specification Language(MSL)文件,其包含概念模型与存储模型之间的映射。
复杂类型支持:比如说,一个客户有电话号码,但你想要电话号码定义为国家区号,地区号,城市区号,号码和分机号。LINQto SQL不支持这种复杂类型,而EntityFramework支持。
查询能力:LINQ to SQL通过DataContext对数据库进行查询。EntityFramework通过ObjectContext通过LINQto Entities进行查询。Entity Framework还提供了ESQL,它是一种类似SQL的查询语言,很适合在模型定义中定义查询。EntityFramework还包含了 ObjectQuery类,用于对象服务在运行时动态创建查询。最后EntityFramework还包含EntityClientProvider,它 用于对概念模型进行查询。
性能:LINQ to SQL和Entity Framework第一次执行查询的时候都比较慢,但之后性能都让人比较满意。EntityFramework性能要稍微优于LINQto SQL。
完善:微软在发布了Entity Framework之后就停止了发布新的LINQ to SQL,但由于LINQto SQL的简单性,它还是很受欢迎的,所以微软仍将继续对LINQto SQL的用户进行支持与反馈,但是LINQto SQL将不再发布新版本进行完善。
由模型生成数据库:LINQ to SQL没有能力由模型生成数据库。Entity Framework支持两种类型的开发模式,数据库优先和编码优先。数据库优先开发,数据库已经存在,所以不需要由模型生成数据库。编码优先,你要先创建你的模型,然后由模型生成数据库。 参考技术A 你可以这样简单理解它们之间的区别:Ado.net Entity Framework 是 LINQ to SQL的升级版LINQ to SQL是将数据库原封不动地映射成模型,而Ado.net Entity Framework可以进行更高层次的映射和自定义,比如这样两个表:学生表ID,名称,所在学校ID学校表ID,名称 学生表的 所在学校ID 与 学校表的 ID 相关联 LINQ to SQL经过映射后的模型中,学生实体的“所在学校ID”属性就是一个ID号,而Ado.net Entity Framework中该属性则是一个学校对象,也就是说Ado.net Entity Framework更接近于面向对象数据库的使用方法。本回答被提问者采纳
Linq To Nhibernate 性能优化(入门级)
最近都是在用Nhibernate和数据库打交道,说实话的,我觉得Nhibernate比Ado.Net更好用,但是在对于一些复杂的查询Nhibernate还是比不上Ado.Net。废话不多说了,下面讲讲Linq To Nhibernate的性能优化。
第一点:应该要分清楚当前代码是在数据库上执行,还是在内存中执行(或者什么时候应该在数据库上做,什么时候应该在内存做)
我们在在做查询的时候,常见的使用方法
上面是使用了Iqueryable接口的,它会把数据先筛完了之后,再返回给我们
这个在数据库里呢,直接是把整个列表返回的,因为用了ToList方法。
所以,在做查询的时候,什么操作要放到数据库层面做,什么操作要放到内存上做,这些都是我们要考虑的。平时这些都应该好好注意这些细节部分,就比如一个系统每年数据量只增加两千条,用多了两年这个系统就报废了,因为查询速度会随着数据量越来越大而越来越慢,而我们能做的就是把这些细节处理好。只要把序列返回的IEnumerable的话呢,这个就是linq to object,就会把数据库的数据,全部拿过来,放到内存中,在操作。所以能够让数据库多帮我们做一些操作,就尽量多做。一般情况下:一般都是在最后ToList的。
第二点:Count和Any来判断集合中是否存在某个序列。
用Count>0大于零来判断序列中是否含有某个元素对于 Array、List<T>或Collection<T>这些都不会存在问题。但是在某些情况下,就会有很大的问题。Any方法是通用的,所以大家最好用这个来判断。
本博客只是把自己的拙见分享给大家,如有不对,欢迎指出。
以上是关于LINQ TO SQL 和 ADO.NET ENTITY 有啥区别呢?的主要内容,如果未能解决你的问题,请参考以下文章
带有存储过程的实体框架 VS LINQ to SQL VS ADO.NET? [关闭]
LINQ体验(11)——LINQ to SQL语句之Null语义和String/DateTime方法
DLinq 演变成哪一个——Linq to SQL 还是实体框架?
linq to sql、Entity Framework 和 NHibernate 的性能如何?