LINQ to SQL和Entity Framework都是一种包括LINQ功能的对象关系映射技术。他们之间的本质差别在于EF对数据库架构和我们查询的类型实行了更好的解耦。

使用EF,我们查询的对象不再是全然相应数据库架构的C#类。而是更高层的抽象:Entity Data Model。这为我们提供了额外的灵活性,可是在性能和简单性上面也会有所损失。



LINQ to SQL由C#团队开发并在.NET Framework 3.5中公布,而Entity Framework由ADO.NET团队开发并作为.NET Framework 3.5 Service Pack 1的一部分公布。

此后,LINQ to SQL由ADO.NET团队接手。其结果是:在.NET 4.0中,ADO.NET团队更加专注于EF的改进。相对来说。LINQ to SQL的改进要小得多。



LINQ to SQL和Entity Framework各有所长,LINQ to SQL是一个轻量级的ORM框架,旨在为Microsoft SQL Server数据库提供高速的应用程序开发,其长处是易于使用、简单、高性能。

而Entity Framework的长处在于:其为创建数据库架构和实体类之间的映射提供了更好的灵活性,它还通过提供程序支持除了SQL Server之外的第三方数据库。



EF 4.0一个很受欢迎的改进是它如今支持与LINQ to SQL差不多的查询功能。这意味着我们在系列文章中的LINQ-to-db查询能够同一时候适用于EF 4.0和L2S。

并且。这也使得L2S成为我们学习使用LINQ查询数据库的理想技术,由于其保持了对象关系方面的简单性,并且我们学习到的查询原则和技术相同适用于EF。

说明:.NET 3.5下建议使用LINQ,该版本号已经全然支持成熟的LINQ。使用EF则建议使用.NET 4.0(VS2010)以上的版本号。该版本号有成熟完整的EF

复杂度:支持越多的特性就会越复杂。LINQ to SQL所支持的特性比較少。所以也就相对不太复杂;而EntityFramework支持的特性比較多,所以相对照较复杂。

模型:LINQ to SQL在数据表与类之间提供了一对一的映射。假设你有Customers,Orders, 和Lineitems表,你就会有Customer,Order, 和Lineitem类来匹配每个表。EntityFramework能够使你有一个Customer类。而这个类能够匹配多个表。这就意味着公司名能够 在一个表中,可是地址是在还有一个表中,而电话号码又在还有一个表中,等等。

数据库server:LINQ to SQL仅仅支持Microsoft SQL Server 2000及之后的版本号,但即使是SQLServer2000也有非常多限制。

EntityFramework能够支持IBMDB2, Sybase SqlAnywhere, Oracle, SQLAzure。还有其它非常多。

开发时间:LINQ to SQL非常easy学。开发起来也非常快,可是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支持两种类型的开发模式。数据库优先和编码优先。数据库优先开发,数据库已经存在,所以不须要由模型生成数据库。编码优先,你要先创建你的模型,然后由模型生成数据库。

LINQ to SQL和Entity Framework对照的更多相关文章

  1. LINQ之路10:LINQ to SQL 和 Entity Framework(下)

    在本篇中,我们将接着上一篇“LINQ to SQL 和 Entity Framework(上)”的内容,继续使用LINQ to SQL和Entity Framework来实践“解释查询”,学习这些技术 ...

  2. LINQ之路 9:LINQ to SQL 和 Entity Framework(上)

    在上一篇中,我们从理论和概念上详细的了解了LINQ的第二种架构“解释查询”.在这接下来的二个篇章中,我们将使用LINQ to SQL和Entity Framework来实践“解释查询”,学习这些技术的 ...

  3. LINQ to SQL和Entity Framework对比与关联 (转载)

    LINQ to SQL和Entity Framework对比与关联       LINQ to SQL和Entity Framework都是一种包含LINQ功能的对象关系映射技术.他们之间的本质区别在 ...

  4. LINQ TO SQL和Entity Framework 的关系 你了解多少?

    1. LINQ  TO SQL  和EF 特点:  LINQ TO SQL和Entity Framework都是一种包含LINQ功能的ORM 也就是所谓的关系对象的映射.其中包括的有DBFrist   ...

  5. 在Linq to sql 和 Entity framework 中使用lambda表达式实现left join

    在Linq to sql 和 Entity framework 中使用lambda表达式实现left join 我们知道lambda表达式在Linq to sql 和 Entity framework ...

  6. LINQ to SQL和Entity Framework

    LINQ to SQL和Entity Framework都是一种包含LINQ功能的对象关系映射技术. 那么为什么会有LINQ这个东西的出现呢. 简单来说LINQ是为了满足不知道怎么操作数据库的程序员开 ...

  7. Linq实战 之 Linq to Sql及Entity Framework操作详解

    Linq实战 之 Linq to Sql及Entity Framework操作详解 一:linq to db的框架 1. linq to sql 2. linq to ado.net entity f ...

  8. LINQ to SQL和Entity Framework对比与关联

    LINQ to SQL和Entity Framework都是一种包含LINQ功能的对象关系映射技术.他们之间的本质区别在于EF对数据库架构和我们查询的类型实行了更好的解耦.使用EF,我们查询的对象不再 ...

  9. 查询大数据表的效率对比:Linq to SQL、Entity Framework、企业库存储过程、ADO.Net

    最近因为要开发大数据量网站,特作比较. Linq to SQL 查询 记录数:399997Linq to SQL 查询 Milliseconds:1910视图查询 记录数:399997视图查询 Mil ...

随机推荐

  1. 迭代 Iterate

    迭代:指按照某种顺序逐个访问列表中的每一项.比如:for语句 逐个访问: lst = ['q', 'i', 'w', 's', 'i', 'r'] for i in lst: print (i), # ...

  2. 关于MemoryBarrier

    备注:OSG  OpenThread::Atomic.cpp中MemoryBarrier(); Atomic::operator unsigned() const { #if defined(_OPE ...

  3. 关于mybatis插入数据库返回主键id

    关于Sequence主键的数据库来说,如: <insert id="add" parameterType="vo.Category"> <se ...

  4. C#/.Net Post获取数据流的一种简单写法

    最近在弄一些第三方的平台,经常调用第三方的接口实现某些特定的功能 在实现的同时基本上都需要本地的数据经过服务器在Request到第三方的服务器中处理,再返回相应的数据结构体:json/xml 以下是我 ...

  5. 函数内部用setTimeout()调用自身函数相当于setInterval()

    本来setTimeout(function(){},time)只执行了一次function,但是当 function demo() { alert(1); setTimeout('demo()' ,5 ...

  6. webservice和.net remoting浅谈

    服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置.   webservice和.net remoting都是用来通信的框架,它们最大的优点是可以像调用本地对象一样调用远程对象,比如: ...

  7. C++服务器设计(二):应用层I/O缓冲

    数据完整性讨论 我们已经选择了I/O复用模型作为系统底层I/O模型.但是我们并没有具体解决读写问题,即在我们的Reactor模式中,我们怎么进行读写操作,才能保证对于每个连接的发送或接收的数据是完整的 ...

  8. YII Framework学习教程-YII的Model-开发规范-路径别名-命名空间

    到这里,大概的YII开发已经基本可以,但是下面要将的所有课程,学完之后可以让你更爱YII.下面的教程是讲的MVC的M,model.数据,业务,代码的集中地区.所以开始之前,学学开发规范-路径别名-命名 ...

  9. zepto.1.1.6.js源码中的each方法学习笔记

    each方法接受要遍历的对象和对应的回调函数作为参数,它的作用是: 1.如果要遍历的对象是类似数组的形式(以该对象的length属性值的类型是否为number类型来判断),那么就把以要遍历的对象为执行 ...

  10. Python之路第十三天,高级(7)-详述数据库一对多,多对多表关系的设计以及如何查询

    一对多表设计和查询方法 #!/usr/bin/env python3 # Author: Zhangxunan from sqlalchemy import create_engine from sq ...