资讯专栏INFORMATION COLUMN

EF数据操作比较详解

novo / 850人阅读

摘要:则是已经执行查询数据库的操作且数据保存在了内存中,所以在进行条件拼接的时候一定要在类型后面追加条件语句,而不是等到之后再开始写条件,以提升性能。

1.数据Load

延迟加载:当实体第一次读取时,相关数据没有加载;当第一次试图访问导航属性时,所需的导航数据自动加载,EF默认使用这种方式加载数据,尽量使用预先加载和显示加载。

优点:加载数据快

缺点:数据库交互多次

预先加载:当读取实体时,相关数据同时读取。这通常会导致一个连接查询,查询所有所需的数据,使用Include方法指定预先加载。

优点: 数据库交互少

缺点:加载实体多,数据量大时,变慢,会有很多冗余字段

显示加载:这种加载方式类似于延迟加载,不同的是我们要在代码中明确地查询相关数据,导航属性是手动控制的,需要调用Collection.Load方法获取集合,调用Reference.Load方法获取单个实体来加载相关数据。

优点: 加载数据快,导航属性如何加载可以自己控制,通常关联实体集合的数量被限制时,使用Load方法

缺点: 需要自己控制,数据库交互多次,交互次数由自己控制

CompiledQuery:提供对查询的编译和缓存以供重新使用。当相同的查询需要执行很多遍的时候,那么我们可以使用ComplieQuery将查询的语句进行编译以便下次使用,这样可以免去对同一语句的多次处理,从而改善性能

优点:减少查询表达式树编译次数

AsNoTracking:如果数据是只读操作,用AsNoTracking取消追踪,提升性能。

SqlQuery:对于复杂的查询或存储过程的使用,考虑用SqlQuery操作原生sql。

Skip:分页在数据库中分页,不要再内存中分页,以提升性能

IQueryableIEnumerableIQueryable返回的是查询表达式,也就是说生成了SQL查询语句但是却还没有与数据库进行交互。IEnumerable则是已经执行查询数据库的操作且数据保存在了内存中,所以在进行条件拼接的时候一定要在IQueryable类型后面追加Where条件语句,而不是等到ToList之后再开始写条件,以提升性能。

2. 数据Get

Find()方法:查找一个实体,不仅查询数据库,而且还查询新添加的没有保存到数据库中的对象。

查找方式:内存查找->新添加还没保存到数据库中的对象->数据库中还没加载到内存中实体

优点:根据主键查找,主键有索引,速度快

缺点:只能根据主键查找

GetObjectByKey()方法:查找一个实体

查找方式:内存查找- >数据库中实体

优点:先从内存中取速度快

缺点:只能根据主键查找,查询不到抛出异常

TryGetObjectByKey()方法:查找一个实体

查找方式:内存查找- >数据库中实体

优点:先从内存中取速度快 , 查询不到返回null

缺点:只能根据主键查找

Single()方法:查找一个实体

查找方式:数据库中实体

优点:不根据主键进行查询或查询时加载相关实体

缺点:查询没有返回结果或返回的结果多于一个就会抛出异常

SingleOrDefault()方法:查找一个实体

查找方式:数据库中实体

优点:不根据主键进行查询或查询时加载相关实体, 查询没有返回结果返回null

缺点:返回的结果多于一个就会抛出异常

First()方法:查找一个实体,不关心是否有多个结果,仅仅取得第一条

查找方式:数据库中实体

优点:不根据主键进行查询或查询时加载相关实体, 只取第一条

缺点:查询没有结果就会抛出异常

FirstOrDefault()方法:查找一个实体,不关心是否有多个结果,仅仅取得第一条

查找方式:数据库中实体

优点:不根据主键进行查询或查询时加载相关实体, 只取第一条,查询没有结果返回null

缺点:不知道是否有多条数据

3.其它优化

事物的简短性:尽量把查询语句和影响事物的语句放在事物外面执行,防止资源死锁。

批量修改:尽量用sql执行

预生成视图:在实体框架可以针对概念模型执行查询或将更改保存到数据源之前,它必须生成一组本地查询视图才能访问数据库。 由于生成这些视图会产生很高的成本,因此,您可以在设计时预生成视图并将它们添加到项目。预生成视图方式参考:

https://msdn.microsoft.com/zh-cn/library/bb896240.aspx

AsEnumerable()ToList():两者都是延迟执行sql,区别是AsEnumerable()在执行过滤之前,先将所有数据放到内存中,再进行筛选;ToList()则是先拼接成sql再请求数据库,然后结果放入内存,是真正的筛选数据。

IQueryableIEnumberableIQueryable实现了IEnumberable接口,IEnumerable 泛型类在调用自己的SKipTake 等扩展方法之前数据就已经加载在本地内存里了,IEnumerable跑的是Linq to Object,强制从数据库中读取所有数据到内存先,而IQueryable 是将Skip ,Take 这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令,它并不是把所有数据都加载到内存里来才进行条件过滤。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/110546.html

相关文章

  • 以太坊基础概念详解

    摘要:主要讲解以太坊中的一些基本元素,如区块账户状态交易费用等。所以它表示的是整个以太坊系统所有账户当前的状态。账户以太坊中有两种账户外部拥有账户,一般指自然人拥有的账户。总结以上就是以太坊里的一些基础元素,没有讲到复杂的交易执行等,后续再写。 本文不讲区块链,也就意味着你有一些区块链的基本认知。主要讲解以太坊中的一些基本元素,如:区块、账户、状态、交易、费用等。因这些概念之间相互紧密联系,...

    pingink 评论0 收藏0
  • 大型企业中如何批量管理千万台服务器之ansible自动化运维工具详解 [⭐建议收藏⭐]

    文章目录 ansible 自动化运维工具 详解关于作者作者介绍一、ansible 概述1.1 ansible 概述1.2 是什么要使用 ansible1.3 ansible 功能1.4 ansible 优点1.5 ansible工作机制1.6 ansible 工作原理/流程图 二、ansible 批量管理服务部署2.1 实验环境2.2 官网安装教程2.2.1 ansible 安装2.2.2 a...

    liangdas 评论0 收藏0
  • URI编解码详解encodeURIComponent、encodeURI

    摘要:可选项目,一般使用隔开或隔开的键值对可选项目包,其它额外的标识信息和的不同这和长得也很相似,是的缩写,译为统一资源定位符。格式类似协议主机名具体地址可能还有参数这里有三个概念,统一资源标识符,统一资源定位符,统一资源名称。 URI URI是Universal Resource Identifier通用资源标志符,是一个用于标识某一互联网资源名称的字符串。 该种标识允许用户对任何(包括本...

    Youngdze 评论0 收藏0
  • linux shell 脚本 入门到实战详解[⭐建议收藏!!⭐]

    文章目录 shell 入门到实战详解[⭐建议收藏!!⭐]关于作者作者介绍一、shell 入门简介1.1 什么是shell1.2 shell 编程注意事项1.3 第一个shell 脚本 hello world 二、shell 环境变量讲解2.1 shell 变量详解2.2 shell 系统变量 介绍2.3 shell 环境变量 介绍2.3.1 常见的系统环境变量 2.4 shell 用户环...

    Gemini 评论0 收藏0
  • Hyperledger Fabric 命令详解之 down

    摘要:停止客户端停止节点,和删除客户端删除和删除网络删除节点容器检查网络检查容器删除删除删除自动化脚本会将生成的文件一起删掉所以,如果需要保留文件的话需要手动删除 ./bash.sh down a@ubuntu:~/hyfa/fabric-samples/first-network$ sudo ./byfn.sh down [sudo] password for a: Stopping w...

    jonh_felix 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<