Entity Framework 和 LINQ To SQL的区别

综述

LINQ是一种语言集成查询,它包含了LINQ to SQL,LINQ to Objects,LINQ to XML,LINQ to Entities(Entity Framework两种查询方式之一,另外一种叫做Entity SQL)。

Entity Framework 是一种ORM (Object Relational Mapping)框架,把关系型数据转换成对象的一种框架。

LINQ to SQL是Linq最初提供的一种访问数据的方式,它允许你从SQL Server数据库获取数据。

LINQ to Entities是Linq提供的另外一种访问数据库的方式。和LINQ to SQL不同的是,它支持的数据库类型和ADO.Net支持的数据库一样多。

什么时候使用Entity Framework 和 LINQ to SQL

当你的应用程序符合以下条件时,就可以使用Entity Framework:

  1. 需要比较灵活的映射关系
  2. 能够查询除SQL Server系列产品以外的关系型数据库
  3. 能够在SSRS,BI,SSIS之间可复用的数据访问模式
  4. 需要提供完整的文本查询语言
  5. 需要查询概念模型的能力

如果你不需要以上的各种功能,那么LINQ to SQL是一种比较简单的快速开发选择。

两种方案的功能比较

LINQ to SQL可概括为:基于SQL Server数据库的快速开发技术。而Entity Framework则意味着企业级开发。

LINQ to SQL是基于SQL Server数据库模型来进行对象映射的,而Entity Framework提供更灵活对象映射,支持更多的类型的数据库。

功能LINQ to SQLEntity Framework
模型(Model)基于数据库实体基于概念模型
数据库只支持SQL Server大部分的数据库
复杂度简单复杂
开发周期快速开发开发缓慢,但是功能更强大
查询方式1. LINQ to SQL (for select) 2. Data Context1. LINQ to Entities (for select) 2. Entity SQL 3. Object Services (for update, create, delete, store procedure, view) 4. Entity Client (is an ADO.NET managed provider, it is similar to SQLClient, OracleClient)
当数据库发生改变不支持同步支持同步
发展性微软不再开发新功能微软主推的ORM框架
自动生成数据库不支持支持
性能第一次较慢第一次较慢,整体会优于前者

性能比较

相对于Entity Framework,LINQ to SQL 是更轻量级的框架,EF需要处理两层模型映射,而LINQ to SQL只有一层映射。EF会生成更多更复杂的TSQL,这些TSQL都是作用于更好的可读性,同时SQL在大多数情况会得到相同的执行计划。但是部分情况下会生成更大更复杂的SQL语句,因此会有性能影响。

而LINQ to SQL在客户端有轻微的查询优化,它会评估where子句进行优化,所以会有更好的查询效率。

LINQ to SQL是否已经被丢弃?

虽然网上有很多人讨论到此功能已经被弃用,但是该功能还是存在于.Net Framework之中,不过该功能完全可以被Entity Framework取代,并且具有更少的限制。

EF是主流,也是微软主推的框架,不过LINQ to SQL也还是被微软支持的。根据不同的情况,可以进行不同的选择。


linq to sql和ef

1、Linq to ef执行过程如下:
在这里插入图片描述
2、以sql server说明linq to sql 和linq to ef差别

Linq to sql 执行用的providerSystem.Data.SqlClient,与数据库直接绑定,执行过程为linq

To sql直接翻译成sql,再通过System.Data.SqlClient执行sql语句。

Linq to ef 执行用的provider是System.Data.EntityClient,即上图紫红色图示,执行过程为linq to entities query 到entity sql(esql),再通过System.Data.EntityClient将esql变为sql,然后System.Data.SqlClient执行sql语句。也就是通过EntityClient进行解耦。

3、两个provider异同与联系:

ADO.NET Data Provider是ADO.NET的基础ProviderADO.NET EF Provider是依赖于ADO.NET Data Provider的,比如SQL Server的ADO.NET EF ProviderSystem.Data.EntityClient,是依赖System.Data.SqlClient

4、postgresql目前所流行的ADO.NET EF Provider

开源的有NpgSql,支持ef和ado方式,不支持ado.net实体数据模型的数据库优先。用起来需要用code first 方式。

商业应用的有Devert的linqconnect,Devert最高版本对linq to sql 和ef都支持。找到的破解版貌似只支持linq to sql。

5、不同EntityClient解释出的sql语句示例,以System.Data.EntityClientNpgSql为例,括号为所用ef驱动到的数据库:

System.Data.EntityClient(sql server)如下:

{SELECT

[Extent1].[Id] AS [Id],

[Extent1].[Cid] AS [Cid],

[Extent1].[Name] AS [Name],

[Extent1].[StartTime] AS [StartTime],

[Extent1].[EndTime] AS [EndTime],

[Extent1].[Status] AS [Status]

FROM [dbo].[Sys_Banci] AS [Extent1]}

NpgSql(postgresql)如下:

{SELECT "Extent1"."Id" AS "Id","Extent1"."Cid" AS "Cid","Extent1"."Name" AS "Name","Extent1"."StartTime" AS "StartTime","Extent1"."EndTime" AS "EndTime","Extent1"."Status" AS "Status"

FROM "dbo"."Sys_Banci" AS "Extent1"}

Entity Framework 架构图

Entity Framework的全称是ADO.NET Entity Framework,是微软开发的基于ADO.NET的ORM(Object/Relational Mapping)框架。

Entity Framework的主要特点:

  1. 支持多种数据库(Microsoft SQL Server, Oracle, and DB2);

  2. 强劲的映射引擎,能很好地支持存储过程;

  3. 提供Visual Studio集成工具,进行可视化操作;

  4. 能够与ASP.NET, WPF, WCF, WCF Data Services进行很好的集成。

在这里插入图片描述
架构图一
在这里插入图片描述
架构图二


EF和linq to sql 关系

LINQ to SQL 允许你用任何类来代表数据库中的数据、表。同样的,EF也允许你用任何类来代表苏据库中的数据、表。

所不同的的地方是Linq to sql 用这些被修饰过的类直接同数据库打交道,存取数据。

但是EF的类则必须通过一个中间层(叫Entity Data Model, EDM)来和数据库打交道,存取数据。

Linq 是查询语法,用于对内存里的对象集合或者数据库表进行查询;

Linq to SQL 是针对SQL Server数据库设计的ORM(对象映射)方案;

Entity Framework是ORM实体框架,同时支持SQL Server;Oracle 等

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 Entity Framework 来操作 SQL Server 数据库Entity Framework 是一个对象关系映射(ORM)框架,它可以帮助你通过代码来操作数据库,而不需要直接编写 SQL 查询语句。 首先,你需要安装 Entity Framework。你可以在 Visual Studio 的 NuGet 包管理器中搜索并安装 Entity Framework 相关的包。 接下来,你需要定义一个数据上下文(DbContext)类,该类表示数据库中的一组实体(表)。你可以在数据上下文类中定义 DbSet 属性,每个 DbSet 属性对应一个实体的集合。 然后,你可以使用 LINQ 查询语法来查询和操作数据库Entity Framework 会将 LINQ 查询转换为相应的 SQL 查询语句,并执行在数据库中。 下面是一个简单的示例: ```csharp // 创建数据上下文类 public class MyDbContext : DbContext { public DbSet<Customer> Customers { get; set; } // 其他实体的 DbSet 属性 } // 定义实体类 public class Customer { public int Id { get; set; } public string Name { get; set; } // 其他属性 } // 使用数据上下文类操作数据库 using (var context = new MyDbContext()) { // 查询数据 var customers = context.Customers.Where(c => c.Name.StartsWith("John")).ToList(); // 插入数据 var customer = new Customer { Name = "John Smith" }; context.Customers.Add(customer); context.SaveChanges(); // 更新数据 customer.Name = "John Doe"; context.SaveChanges(); // 删除数据 context.Customers.Remove(customer); context.SaveChanges(); } ``` 这只是一个简单的示例,你可以根据具体的需求进一步学习和使用 Entity Framework 操作 SQL Server 数据库

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值