Querying Data
EFCore是使用LINQ语法去数据库中查询数据,查询的声明周期基本如下:
LINQ查询进程准备一个EFCore的核心提供商来准备进行查询,而这个进程会进行缓存不需要每次查询都执行一遍
结果通过数据库提供商:
什么时候执行查询结果动作:
- 当有通过循环遍历查询结果的时候,执行查询如for
- 当使用如tolist(),toArray(),single(),count等方法的时候执行查询
- 将查询结果绑定到UI控件的时候
Basic Query
EF Core使用Linq语法从数据库查询数据,Linq允许使用C#来写强类型的查询语句,常用的Linq查询操作如下
1) 加载所有数据:
2) 加载单个实体数据
3) 过滤数据查询:
Loading Related Data
EF Core允许通过导航属性加载跟实体关联的相关实体信息,有三种加载方式:
ü Eager loading(立即加载)表示查询将作为连接数据库时的一部分定义查询
默认情况下EF Core都会自动预加载导航属性,所以当需要显示加载的时候就可以通过include方法来加载关联实体信息,且可通过多层连接关系加载单个实体
还可通过ThenInclude方法来加载多重关系中的单个实体信息,比如加载所有blogs且通过导航属性加载每篇blog的作者,然后通过作者的关联实体加载作者的图片。
ü Explicit loading(显式加载)通过DbContext.Entry()显式的加载查询数据,t
查询关联的导航属性实体
ü Lazy loading(延迟加载)表示相关数据通过访问导航属性时加载
目前暂不支持
Tracking&No-Tracking
实体信息跟踪行为用来跟踪实体信息是否更新改变,当一个实体被标记则它的更改将会被追踪直到调用SaveChanges()
1) Tracking queries
默认情况查询是返回被跟踪的实体类型,意味着可以在调用SaveChanges方法前更改信息。如下示例显示通过查询数据,然后通过查询的实体更新信息,最后保存
2) No-Tracking queries
未追踪查询一般是用于只读场景中,因为没有被追踪所以执行迅速
当然也可以通过数据库上下文的查询行为来设置
3) Tracking and Projections
Raw SQL Queries(SQL语句查询)
在关系数据库中允许使用原始SQL语句进行查询
ü SQL语句查询只能返回模型中的实体类型
ü 所有SQL语句查询必须返回数据实体类型的属性
ü 结果集的列名必须匹配到属性映射到表的名称
ü 原始SQL查询不能包含关联实体的查询
1) Baseic Raw SQL queries:通过fromsql扩展方法进行查询
同样也可以执行存储过程
2) Pass parameters
在使用SQL语句时,可以传递参数进去,传参共有两种方式:
l 通过string.Format函数格式化
l 通过SqlParameter进行参数格式化
3) Composing with LINQ
可以将SQL语句查询跟LINQ语句查询结合使用
Asynchronous queries(异步查询)
异步查询可以在数据库中执行查询时避免阻塞一个线程,非常实用于UI界面等待过程,同样在web程序中也是可以释放线程来执行其他请求。在EFCore中凡是包含ToListAsyn()、ToArrayAsyn()、SingleAsyn()等都是异步,而Linq的where()、orderby()是没有实用异步的