-
客户端与服务器评估
-
顶级投影
-
不支持的客户端评估
-
显式客户端评估
-
-
跟踪与非跟踪查询
- 无健实体
- 跟踪查询
- 非跟踪查询
- 标识解析
- 跟踪和自定义投影
-
复杂查询运算符
- Join
- GroupJoin
- SelectMany
- 集合选择器不引用外部
- 集合选择器引用 where 子句中的外部
- 集合选择器引用非 where 情况下的外部
- GroupBy
- Left Join
-
加载相关数据
https://docs.microsoft.com/zh-cn/ef/core/querying/related-data-
预加载
- Include , ThenInclude
a. 经过筛选的包含
b. 派生类型上的包含
- Include , ThenInclude
-
显式加载
- 查询相关实体
-
延迟加载
- 使用代理的延迟加载
a. 安装 Microsoft.EntityFrameworkCore.Proxies 包
b. 配置 DbContext 调用 UseLazyLoadingProxies 扩展方法
c. 属性必须为 Virtual 且类可继承 - 不使用代理的延迟加载
a. 不需要属性为 Virtual 且不要求类可继承
- 使用代理的延迟加载
-
关联数据和序列化
Json序列化时的可能的循环引用异常
配置 JsonNet 忽略循环引用
services.AddMvc() .AddJsonOptions( options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore );
-
-
异步查询
当在数据库中执行查询时,异步查询可避免阻止线程
一组类似于 LINQ 方法的异步扩展方法 -
原生 SQL 查询
- 原始 SQL 查询可返回一般实体类型或者模型中的无键实体类型。
- 无法直接将一个 SQL 映射为一个普通类 ( 即不在 dbContext 使用 DbSet 定义的属性 )
- 基本原生 SQL 查询
var blogs = context.Blogs .FromSqlRaw("SELECT * FROM dbo.Blogs") .ToList();
- 传递参数
var user = "johndoe";
var blogs = context.Blogs
.FromSqlRaw("EXECUTE dbo.GetMostPopularBlogsForUser {0}", user)
.ToList();
FromSqlInterpolated 和 ExecuteSqlInterpolated方法, 使用字符串内插语法,
但是 {} 通过 DbParamater 形式传递,而不是直接的字符串替代;
例如下面代码中的 user
var user = "johndoe";
var blogs = context.Blogs
.FromSqlInterpolated($"EXECUTE dbo.GetMostPopularBlogsForUser {user}")
.ToList();
-
原生SQL结合LINQ 和 包含关联数据
-
更改跟踪
-
限制
-
全局查询筛选器
a. 定义查询筛选器
modelBuilder.Entity<Blog>().Property<string>("_tenantId").HasColumnName("TenantId");
// Configure entity filters
modelBuilder.Entity<Blog>().HasQueryFilter(b => EF.Property<string>(b, "_tenantId") == 22);
modelBuilder.Entity<Post>().HasQueryFilter(p => !p.IsDeleted);
b. 禁用 查询筛选器
c. 限制 -
查询标记
不改变SQL的执行,而是在SQL中增加注释文本,多次调用将增加多行注释文本
IQueryable.TagWith(string tags) 方法
网友评论