貪婪加載顧名思議就是把所有要加載的東西一次性讀取。
本節內容為了配合【延時加載】而誕生,貪婪加載和他本該在一起介紹,開發項目的過程中應該雙管齊下,才能寫出高質量的程序。
Dto 映射查詢
Select<Tag>().Limit(10).ToList(a => new TestDto { id = a.Id, name = a.Title });
Select<Tag>().Limit(10).ToList(a => new TestDto());
Select<Tag>().Limit(10).ToList(a => new TestDto { });
Select<Tag>().Limit(10).ToList(a => new TestDto() { });
Select<Tag>().Limit(10).ToList<TestDto>();
這種映射支持單表/多表。
查找規則,查找屬性名,會循環內部對象 _tables(join 查詢后會增長),以 主表優先查,直到查到相同的字段。
如:
A, B, C 都有 id,Dto { id, a1, a2, b1, b2 },A.id 被映射。也可以指定 id = C.id 映射。
友情提醒:在 dto 可以直接映射一個導航屬性
導航屬性 ManyToOne/OneToOne
ManyToOne/OneToOne 導航屬性通過 ToList() 加載,這個方法有一個參數:includeNestedMembers。
參數說明:
false: 返回 2級 Join 的數據;
true: 返回所有層級深度 Join 的導航數據;
如果查詢中已經使用了 a.Parent.Parent 類似表達式,則可以無需 LeftJoin 等操作。
如:
Select<Tag>().Where(a => a.Parent.Name == "1").ToList();
//這樣寫,不需要再標記 Join,解析表達式時自動處理成 LeftJoin
如果導航屬性沒有使用,又想加載,可使用 Include 方法。
Select<Tag>().Include(a => a.Parent).ToList();
導航屬性 OneToMany/ManyToMany
IncludeMany 貪婪加載集合的導航屬性,其實是分兩次查詢,在 ToList 后進行了數據重裝。
Select<Tag>().IncludeMany(a => a.Songs).ToList();
//這是 ManyToMany 關系的貪婪加載
OneToMany 的使用方法相同
IncludeMany 有第二個參數,可以進行二次查詢前的修飾工作。
Select<Tag>().IncludeMany(a => a.Songs, then => then.Where(song => song.User == "admin")).ToList();
然后,其實在 then 那里,還可以繼續進行向下 Include/IncludeMany。只要你喜歡,向下 100 層都沒問題。
變異
變異的 IncludeMany,即使選擇的不是導航屬性,也可以貪婪加載。
Select<Tag>().IncludeMany(a => a.TestManys.Where(b => b.TagId == a.Id));
支持聯合鍵關系指定
比如 EFCore include 吧,如何只查詢每項子集合的前幾條數據,它只可以加載所有導致IO性能低下(如果某些子集合,有100條,200條),FreeSql 可以解決這個問題。
Select<Tag>().IncludeMany(a => a.TestManys.Take(10));
系列文章導航
(一)入門
(二)自動遷移實體
(三)實體特性
(四)實體特性 Fluent Api
(五)插入數據
(六)批量插入數據
(七)插入數據時忽略列
(八)插入數據時指定列
(九)刪除數據
(十)更新數據
(十一)更新數據 Where
(十二)更新數據時指定列
(十三)更新數據時忽略列
(十四)批量更新數據
(十五)查詢數據
(十六)分頁查詢
(十七)聯表查詢
(十八)導航屬性
(十九)多表查詢
(二十)多表查詢 WhereCascade
(二十一)查詢返回數據
(二十二)Dto 映射查詢
(二十三)分組、聚合
(二十四)Linq To Sql 語法使用介紹
(二十五)延時加載
(二十六)貪婪加載 Include、IncludeMany、Dto、ToList
(二十七)將已寫好的 SQL 語句,與實體類映射進行二次查詢
(二十八)事務
(二十九)Lambda 表達式
(三十)讀寫分離
(三十一)分區分表
(三十二)Aop
(三十三)CodeFirst 類型映射
(三十四)CodeFirst 遷移說明
(三十五)CodeFirst 自定義特性