(实战)WebApi第9讲:EFCore性能优化(IQueryable延迟查询、取消跟踪机制)
一、例子是第8讲的四、6(EFCore的静态化处理 ):分析ToList()
ToList()在下图绿色框内。
二、在没有最终取数据的时候,使用 IQueryable<T> 延迟执行查询
(1)在没有最终取数据的时候,不要使用ToList
等方法,因为他们会直接读取数据库
First
和 Find
方法会立即执行查询并从数据库中读取数据,而 ToList
和其他类似的方法(如 ToArray
、Count
等)也会立即执行查询,但它们返回的是一个集合。
(2)IQueryable<T> 延迟查询的原理、使用方法、作用
1>原理
1)IQueryable
<T>
是一个泛型接口,它允许你构建查询但不立即执行它。
2)查询的实际执行会在你迭代 IQueryable
对象(如通过 ToList
、First
等方法)或访问某些属性(如 Count
)时发生。
2>使用方法
1)使用.where,一直在拼接sql语句,并没有执行。(因为.where返回的类型也是IQueryable)
2)在最终取数据的时候,使用ToList
等这些方法执行sql语句。
3)举例
3>作用:节省开销,能更有效地管理数据库访问。
(3)如何在数据库中查看ToList
等方法执行的sql语句?【体验延迟发送数据】
1>打开数据库监听工具
2>在VS中使用ToList()等方法读取数据库:会在数据库中直接执行sql语句
2>在VS中使用IQueryable<T> 延迟执行查询,打上断点查看语句执行过程
1)使用.where,一直是在拼接sql语句,并没有执行(因为.where返回的类型也是IQueryable)
2>到ToList()时,数据库内执行sql语句
二、跟踪机制
1、如何修改数据库里的数据?【推荐】——Update()和SaveChanges()
m
是一个代表集合 jobs
中每个元素的临时变量(或称为范围变量)。这个变量 m
用于在 Single
方法的条件表达式中引用集合中的每个元素。
2、跟踪机制:在实体查询之后,上下文会自动的跟踪实体。
举例:在上述二、1、进行完后,注释掉.Update(),再次运行仍然能修改数据库里的数据
3、提高EFCore查询效率:取消跟踪机制
1>为什么要取消?:对于有些数据只需要查询,不需要修改。那么此时跟踪机制会增加系统的开销,降低系统性能。
1)如下图,本意是只需要返回job,不需要它做任何的操作。
2)但是由于跟踪机制,系统会自动追加一个自动更新的快照,去追踪job。
3)所以如果按照1)的本意【即不需要它做任何的操作(不需要更新等)】,那么系统的自动跟踪就白做了
2>如何取消跟踪机制?
1)全局取消
2)局部取消