LINQ TO SQL和Entity Framework 的关系你了解多少?_风神.NET的博客-程序员宅基地

技术标签: linq  linq to sql  LINQ|表达式树  entity framework  ADO.NET 和 Entity Framework  

1. LINQ TO SQL 和EF 特点: LINQ TO SQLEntity Framework都是一种包含LINQ功能的ORM 也就是所谓的关系对象的映射。其中包括的有DBFrist Code Frist ModeL Frist 三种中方式 来进行和数据库之间的访问。只是形式不同而已本质没有什么区别。都是ORM 之间的转化。最终都是来进行访问底层的数据库的对象 和服务。

简单来说LINQ是为了满足不知道怎么操作数据库的程序员开发设计的,LinQ 可以让他们以一种面向数据对象的方式来思考,及持久化他们的数据。 当然最后来进行访问数据库的无论是Oracle SQL Server MySQL MongoDB DB2 等等 都是最终生成 SQL 语句来进行访问数据库的 和传统的ADO.NET 直接来访问数据库没有什么直接的区别,只是,MicroSoft 将其 CRUD 的一些方法进行封装了而已,让开发使用起来更加的方便开发的速度更加的快速 ,更加的专注于核心的业务的开发的开发 ,而不是在为这些简单的操作而耽搁太多的时间。可以让开发节省更多的开发的时间 去做更多的事情。

当然你使用SQL Server 中的SQL Profile来进行查看其中生成的SQL , 那么问题来了 如果Oracle MySQL DB2 MongoDB 如何进行查看生成的SQL 语句 了。那么这个时候你需要进行 使用nuGet 来进行添加一个第三方的程序集。MiniProfiler.dll 来进行查看生成的生成的SQL 语句 当然关于如何使用 可以进行参考 (http://www.cnblogs.com/jiekzou/p/6374726.html) 博客上面具有介绍我就不一一的说了。其中 无论是LINQ TO SQL 还是 EF 最终的形式都是通过DBContext 来进行访问数据库。

LINQ TO SQLEntity Framework 两者的本质的区别:

EF对数据库架构和我们查询的中实现更好的解耦。使用EF,我们查询的对象不再是完全对应数据库架构的C#类,而是更高层的抽象:Entity Data Model。这为我们提供了额外的灵活性其中在性能和简单性上面也会有所损失。 这个是必须的。 毕竟在解析中性能以及功能性都是有所损失的。

优点:LINQ TO SQL,是一个轻量级的ORM框架,为Microsoft SQL Server数据库提供快速的应用程序开发,其优点是易于使用、简单、高性能。Entity Framework,为创建数据库架构和实体类之间的映射提供了更好的灵活性,它还通过提供程序支持除了SQL Server之外的第三方数据库。 例如其中的MySQL Oracle MongoDB DB2 等等 都是可以映射以及访问的。

EF 6.0 经过Microsoft 的改进性能相对于EF 4.0 确实提升了不少 其中对于CRUD 的访问。这意味着我们在系列文章中的LINQ TO DB 查询可以同时适用于EF 4.0 以下的版本和L2S。而且,这也使得LINQ TO SQL 成为我们学习使用LINQ查询数据库的理想技术, 因为保持着对象和关系之间的映射的性 那么 在使用变得的非常的简单 以及灵活性,并且我们学习到的查询原则和技术同样适用于EF。

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

说明 LINQ TO SQL Entity Framework 4.0+
复杂度 相对不复杂 相对比较复杂
模型 域模型(DOMAIN MODEL) 概念数据模型(Conceptual DATA MODEL)
数据库服务器 SQL Server 多种数据库产品
开发时间 快速应用开发 需要较长时间,但支持更多特性
继承 困难 容易
文件类型 DBML文件 EDMX,CDSL,MSL,SSDL文件
复杂类型支持 不支持 支持
查询能力 通过DataContext ESQL,对象服务, Entity Client
性能 第一次查询较慢(延迟加载) 第一次查询也较慢(延迟加载),但总体优与LINQ to SQL 对于复杂的数据类型结合比较好
完善 不再出新版本 还出新版本目前已经更新到EF 6.0+ 以上的版本
从模型生成数据库 支持 支持 DBFrist ModelFrist Code Frist

2.LINQ TO SQL 和Entity Framework 复杂度:

LINQ TO SQL 支持特性比较少一些;但是相对于EntityFramework支持的特性比较多,所以稍微比较复杂一些但是 两者可以相互结合的使用。将其转化集合 还是非常好使用的。没必要将形式局限与 LINQ TO SQL 还是其中的LAMBDA 表达式上卖弄

LINQ TO SQL在数据表与类之间提供了一对一的映射 和一对多之间的关系等等 当然 你也可以进行对于将对象直接作为查询的条件进行 查询这样的效率是非常的高的。

LINQ TO SQL只支持Microsoft SQL Server 2000及之后的版本当然你选择的数据库版本高一些还是比较好的 毕竟高版本的数据库使用起来无论是性能还是操作起来都是非常的方便的,但即使是SQLServer2000也有很多限制。EntityFramework可以支持DB2, MonogoDB, Oracle, MySQL还有其他的数据库等等。

3.LINQ TO SQL 和Entity Framework开发时间:

LINQ TO SQL很容易学,开发起来也很快,但是LINQ TO SQL有一些限制,在开发较复杂的应用时可能会产生问题。EntityFramework的能力更强,虽然学习及应用起来比较慢,但是对更多的特性的支持使得在开发较复杂的应用时可以使问题最小化。当然我建议一些初学者还是老老实实的 从ADO.NET 开始进行学起,毕竟 知道知其然然后知其所以然 这样对于你写的Linq TO SQL 还是 EF 都是帮助非常的大的。

4.LINQ TO SQL 和Entity Framework继承:

LINQ TO SQL支持TPH,而EntityFramework支持TPH和TPT,并且对TPC也部分支持。

5.LINQ TO SQL 和Entity Framework 文件类型:

LINQ to SQL使用包含XML的数据库标记语言(DBML)文件来映射entity与数据表。EntityFramework 使用四个文件。第一个是Entity Data Model (EDMX),这个是在设计器中使用的。在编译时EDMX文件产生了其他三个文件。另外三个文件中,第一个是ConceptualSchema Definition Language(CSDL)文件,其包含概念模型的XML定义。第二个是SchemaDefinition Language(SSDL)文件,其包含存储模型的定义。第三个文件是Mapping Specification Language(MSL)文件,其包含概念模型与存储模型之间的映射。

6.LINQ TO SQL 和Entity Framework 复杂类型的变化:

比如说,我们遇到一些复杂的表格进行关联的时候。LINQ TO SQL不支持这种复杂类型,而EntityFramework支持。但是我们遇到这样的问题的时候可以通过将EF 结合到 LINQ TO SQL 集合来进行查询 并进行 处理就可以了。

//例如下面进行查询过和订单相互关联的数据集合

var AccountList = (from u in StarList.Where(u => u.FUST_LEVEL == 3).ToList() join p in MyDataContexter.fa_brokerage_bill_table.Where(p => p.FBBT_TIME.Year == date.Year && p.FBBT_TIME.Month == date.Month && p.FBBT_STATE != 0).ToList() 
on u.FUST_ID equals p.FBBT_FUST_ID
orderby p.FBBT_CREATETIME descending

select new AccountInfo
{
Flag = u.FUST_LEVEL,
UserImg = AliyunRoot+u.FUST_HEADIMAGE,
UserName = u.FUST_REALNAME != "" ?( u.FUST_REALNAME.Length > 3 ? u.FUST_NICKNAME.Substring(0, 3) + "..." : u.FUST_NICKNAME) : (u.FUST_NICKNAME.Length > 3 ? u.FUST_NICKNAME.Substring(0, 3) + "..." : u.FUST_NICKNAME),
Income = p.FBBT_BIGSTAR_MONEY.ToString("N2") ?? "0.00",
ShowIncome = p.FBBT_BIGSTAR_MONEY,
StarID = u.FUST_ID,
StarLevel = u.FUST_LEVEL,
JoinTime = u.FUST_JOINTIME.ToString("yyyy-MM-dd")
}).ToList();

7.LINQ TO SQL 和Entity Framework 查询的速度和能力:

LINQ TO SQL通过DataContext对数据库进行查询。EntityFramework通过ObjectContext通过LINQ TO ENTITY 进行查询。Entity Framework还提供了EDMX SQL,它是一种类似SQL的查询语言,很适合在模型定义中定义查询。EntityFramework还包含了ObjectQuery类,用于对象服务在运行时动态创建查询。最后EntityFramework还包含EntityClientProvider,它用于对概念模型进行查询。

// 查询销售记录
 var QWXery = (from s in XZUser.Where(e => e.FUST_LEVEL == 2)
 where s.FUST_LEVEL_ID == strUserID
 join a in MyDataContexter.fa_brokerage_sales_table on s.FUST_ID equals a.FBPT_FUST_ID
 group a by a.FBPT_FUST_ID into g
 select new
 {
 g.Key,
 ZCount = g.Count(),
 ZMoney = g.Sum(p => p.FBPT_MONEY)
 }).ToList();

 // 查询订单记录
 var QXXery = (from s in XZUser.Where(e => e.FUST_LEVEL == 3)
 where s.FUST_RECOMMEND_ID == strUserID
 join b in MyDataContexter.fa_brokerage_sales_table
 on s.FUST_ID equals b.FBPT_BUY_FUST_ID
 group b by b.FBPT_BUY_FUST_ID into g
 select new
 {
 g.Key,
 ZCount = g.Count(),
 ZMoney = g.Sum(p => p.FBPT_MONEY)
 }).ToList();

 // 联合一下
 var QuerList = (from z in (from s in QWXery select s).Union(
 from a in QXXery select a)
 select new OrderList
 {
 ID = z.Key,
 GCount = z.ZCount,
 HJMoney = z.ZMoney
 }).ToList();
 return QuerList;
 }
 else
 {
 // 查询星星就可以了
 var QXXery = (from s in XZUser
 where s.FUST_RECOMMEND_ID == strUserID
 join b in MyDataContexter.fa_brokerage_sales_table
 on s.FUST_ID equals b.FBPT_BUY_FUST_ID
 group b by b.FBPT_BUY_FUST_ID into g
 select new OrderList
 {
 ID = g.Key,
 GCount = g.Count(),
 HJMoney = g.Sum(p => p.FBPT_MONEY)
 }).ToList();

 return QXXery;
 }

8.LINQ TO SQL 和Entity Framework 性能:

LINQ TO SQL和Entity Framework 在第一次进行比较缓慢 这个由于进行访问 数据从而 在解析以及读取数据等等 速度并不让人满意,但是只有在进行请求 访问的时候速度就比较快了 因为LINQ TO SQLEF 都涉及到一个延迟加载的问题 第二次加载后由于读取的数据早已放入 缓存 中速度还是让人满意的 所以开发以及用户200W 以内的数据的数据 就没有必要去考虑这些性能的问题,毕竟EF 6.0对于EntityFramework 做了很大的优化性能要稍微优于LINQ TO SQL。 还是非常值得使用的。 如果对于并发可以考虑采用事务或者LOCK 来进行处理这些问题。 如果真是数据量非常的大那么查询过的结构足够的复杂,那么 采用存储过程 来做倒是还不错的。LINQ TO SQL 存储过程 EF 存储过程 来做 。倒是挺好的。

9.LINQ TO SQL 和Entity Framework 优化的处理:
一直有人对于 EF 和 LINQ TO SQL 的性能的问题存在很大的质疑 当然 这个是必须的。对于我们写的 LINQ 语句 以及 LAMBDA 的时候需要注意 就是了 理清楚表之间的关系 以及各个对象之间的关系,做到优化的查询 等等。具体如果做 我抽时间在写关于如何优化LINQ表达式以及 LAMBDA表达式做法。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/WuLex/article/details/79039728

智能推荐

渗透测试工具——漏洞扫描工具_cvss工具-程序员宅基地

安全漏洞产生的原因技术原因软件系统复杂性提高,质量难于控制,安全性降低 公用模块的使用引发了安全问题经济原因“柠檬市场”效应——安全功能是最容易删减的部分环境原因从传统的封闭、静态和可控变为开放、动态和难控 攻易守难安全缺陷安全性缺陷是信息系统或产品自身“与生俱来”的特征,是其“固有成分”安全漏洞是与生俱来的系统设计缺陷Internet从设计时就缺乏安全的总体架构和设计 TCP/IP中的三阶段握手.软件源代码的急剧膨胀Windows 95 1500万行_cvss工具

Vue3.0 directive的使用说明-程序员宅基地

1. 指令生命周期关键字变更在3.0中指令的注册和其生命周期是这样的import { createApp } from 'vue'const app = createApp({})// 注册app.directive('my-directive', { // Directive has a set of lifecycle hooks: // called before bound element's parent component is mounted beforeMount

ORACLE opatch 打补丁fuser command output for /u01/....../bin/crsctl.bin is Failure_error : the opatch applicable check failed. the pa-程序员宅基地

最近,本地测试数据库oracle 11.2.0.4 for rhel7打补丁的时候失败了,检查opatch应用补丁的日志显示错误提示如下:CRS-4133: Oracle High Availability Services has been stopped.Successfully unlock /u01/app/11.2.0/grid2020-06-26 17:05:46: Invoking removeproc to clean oracle client procs202..._error : the opatch applicable check failed. the patch /u01/201020/28813878/2

一个计算机男编程获得一个女友电影,给大家介绍一部机器女友不惜扯断自己身体去救男朋友的电影..._不穿衣服的石头的博客-程序员宅基地

原标题:给大家介绍一部机器女友不惜扯断自己身体去救男朋友的电影今天给大家介绍一部一个机器女友不惜扯断自己身体去救自己男朋友的电影,电影的故事特别精彩推荐给大家看一下。 这部电影的女主角是绫濑遥主演的,她总是能把世界上根本就不存在的这种纯爱演绎得让观众深深动容并对人生充满希望。尽管事后总会被拉回现实。但当时的感动历久弥新。 在电影中。她都能把微小的事物表现的淋淋尽致,包括一个小小的表情,眼神。在这部...

CK11,CK11N 成本估算数据读取_ck_f_material_calc-程序员宅基地

CK11,CK11N 成本估算数据读取CK11 数据读取在程序使用中有时需要临时取成本估计的过程结果数据,此时的估算数据尚未保存至数据库,无法通过函数CK_F_CSTG_STRUCTURE_EXPLOSION 取得,可使用CK_F_MATERIAL_CALC进行先计算出中间结果,再经过相应转换可得出相要的结果。以下是步骤展示:第一步:使用CK_F_MATERIAL_CALC 计算中间结果第二步:使用类cl_costing_persistence方法 costing_read_simp_ck_f_material_calc

几种通信方式介绍(一)————串行通信技术介绍-程序员宅基地

一、串行通信简单介绍*串行通信指数据是一位一位按顺序传送的通信方式,相对于并行通信,其突出优点是只需要一对传输线,缺点是传输速度较低。串行通信的传输方向通常有三种,单工、半双工和全双工。单向顾名思义只允许数据向一个方向传输;半双工允许两个方向传输,但在同一时刻只能往一个方向传输;全双工则允许双向同时传输数据。串行通信有两种基本通信方式,异步通信和同步通信。异步通信不需要传输时钟信号,通信双方的时钟是各自独立的,但双方必须是相同的通信速率和数据格式,即相同的通信协议。其帧格式一般为:起始位+数据位_串行通信

随便推点

VGGNet笔记_vggnet论文笔记-程序员宅基地

转自:https://blog.csdn.net/muyiyushan/article/details/628952021. 简介VGGNet由牛津大学的视觉几何组(Visual Geometry Group)提出,是ILSVRC-2014中定位任务第一名和分类任务第二名。其突出贡献在于证明使用很小的卷积(3*3),增加网络深度可以有效提升模型的效果,而且VGGNet对其他数据集具有很好的泛化能力..._vggnet论文笔记

Matlab中消除图像噪声之中值滤波器:medfilt2_对有噪声图像做中值滤波处理-程序员宅基地

Matlab中消除图像噪声之中值滤波器:medfilt2  medfilt2, matlab, 消除噪声, 中值滤波器, 椒盐噪声  在图像处理中,在进行如边缘检测这样的进一步处理之前,通常需要首先进行一定程度的降噪。中值滤波是一种非线性数字滤波器技术,经常用于去除图像或者其它信号中的杂讯。这个设计思想就是检查输入信号中的采样并判断它是否代表了信号,使用技术个采样组成的观察窗实现这项功能。_对有噪声图像做中值滤波处理

Ionic3/4中如何上传图片(拍照/图片选择)_ionic中上传后台图片文件流怎么做-程序员宅基地

[Talk is cheap. Show me the code]不想看理论知识请直接移步最后代码示例。(本文还是建议看下整体思路)最初我写APP的时候使用 了Ionic3,今天去看了下文档,Ionic4相对于3的文档说明更清晰,代码也更加简化,社区变得越来越好还真是有点小开心呢。但也有批评说Ionic4相对于3更复杂,坑更多。手机端图片上传有两种方式一种是 拍照上传 另一种是 图片..._ionic中上传后台图片文件流怎么做

Java中的四种引用类型比较-程序员宅基地

1.引用的概念引用这个概念是与JAVA虚拟机的垃圾回收有关的,不同的引用类型对应不同的垃圾回收策略或时机。垃圾收集可能是大家感到难于理解的较难的概念之一,因为它并不能总是毫无遗漏地解决Java运行时环境中堆管理的问题。垃圾回收的大致思路是:当Java虚拟机觉得内存不够用的时候,会触发垃圾回收操作(GC),清除无用的对象,释放内存。可是如何判断一个对象是否是垃圾呢?其中的一个方..._java四种引用的区别

树莓派尝鲜指南_树莓派入门 知乎-程序员宅基地

关于树莓派的简介和硬件结构,可以参考https://zhuanlan.zhihu.com/p/980774190为啥要买家里的小米盒子1代早不堪大用,查了一下最新款300块,再想了下现在的盒子早就不是当初那时候了,各种免费的野生电视APP死的死收编的收编,免费资源很难找,直播啥的还得折腾,还不如搞个树莓派,之前我一直是用笔记本开kodi挂电视上用的,但笔记本功耗高,也不能一直挂着,树莓派还可以折腾折腾弄个NAS啥的,性价比感觉比小米盒子高。1购买购买渠道我查了某宝和某东,某东价格明显虚高,决_树莓派入门 知乎

COMSOL Multiphysics之二十大使用技巧(上)_comsol体积分表达式_易易易763的博客-程序员宅基地

本文转自:有限元仿真分析一、 全局约束对于多物理仿真,添加全局约束是COMSOL非常有用的功能之一。例如,对于一个涉及传热的仿真,希望能够调整热源Q_0的大小,从而使得某一位置处的温度T_probe恒定在指定值T_max,我们可以直接将这个全局约束添加进来即可。有些情况下,全局约束可能包含有对时间的微分项,也就是常说的常微分方程(ODE),COMSOL同样也支持自定义ODE作为全局约束。例如,在一个管道内流体+物质扩散问题的仿真中,利用PID算法控制管道入口的流速u_in_ctrl,从而使得某一_comsol体积分表达式

推荐文章

热门文章

相关标签