-
客戶端與服務(wù)器評估
-
頂級投影
-
不支持的客戶端評估
-
顯式客戶端評估
-
-
跟蹤與非跟蹤查詢
- 無健實(shí)體
- 跟蹤查詢
- 非跟蹤查詢
- 標(biāo)識解析
- 跟蹤和自定義投影
-
復(fù)雜查詢運(yùn)算符
- Join
- GroupJoin
- SelectMany
- 集合選擇器不引用外部
- 集合選擇器引用 where 子句中的外部
- 集合選擇器引用非 where 情況下的外部
- GroupBy
- Left Join
-
加載相關(guān)數(shù)據(jù)
https://docs.microsoft.com/zh-cn/ef/core/querying/related-data-
預(yù)加載
- Include , ThenInclude
a. 經(jīng)過篩選的包含
b. 派生類型上的包含
- Include , ThenInclude
-
顯式加載
- 查詢相關(guān)實(shí)體
-
延遲加載
- 使用代理的延遲加載
a. 安裝 Microsoft.EntityFrameworkCore.Proxies 包
b. 配置 DbContext 調(diào)用 UseLazyLoadingProxies 擴(kuò)展方法
c. 屬性必須為 Virtual 且類可繼承 - 不使用代理的延遲加載
a. 不需要屬性為 Virtual 且不要求類可繼承
- 使用代理的延遲加載
關(guān)聯(lián)數(shù)據(jù)和序列化
Json序列化時的可能的循環(huán)引用異常
配置 JsonNet 忽略循環(huán)引用
services.AddMvc() .AddJsonOptions( options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore );
-
-
異步查詢
當(dāng)在數(shù)據(jù)庫中執(zhí)行查詢時,異步查詢可避免阻止線程
一組類似于 LINQ 方法的異步擴(kuò)展方法 -
原生 SQL 查詢
- 原始 SQL 查詢可返回一般實(shí)體類型或者模型中的無鍵實(shí)體類型。
- 無法直接將一個 SQL 映射為一個普通類 ( 即不在 dbContext 使用 DbSet 定義的屬性 )
- 基本原生 SQL 查詢
var blogs = context.Blogs .FromSqlRaw("SELECT * FROM dbo.Blogs") .ToList(); - 傳遞參數(shù)
var user = "johndoe";
var blogs = context.Blogs
.FromSqlRaw("EXECUTE dbo.GetMostPopularBlogsForUser {0}", user)
.ToList();
FromSqlInterpolated 和 ExecuteSqlInterpolated方法, 使用字符串內(nèi)插語法,
但是 {} 通過 DbParamater 形式傳遞,而不是直接的字符串替代;
例如下面代碼中的 user
var user = "johndoe";
var blogs = context.Blogs
.FromSqlInterpolated($"EXECUTE dbo.GetMostPopularBlogsForUser {user}")
.ToList();
原生SQL結(jié)合LINQ 和 包含關(guān)聯(lián)數(shù)據(jù)
更改跟蹤
限制
-
全局查詢篩選器
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. 限制 -
查詢標(biāo)記
不改變SQL的執(zhí)行,而是在SQL中增加注釋文本,多次調(diào)用將增加多行注釋文本
IQueryable.TagWith(string tags) 方法