FreeSql (二十六)贪婪加载 Include、IncludeMany、Dto、ToList
貪婪加載顧名思議就是把所有要加載的東西一次性讀取。
本節(jié)內(nèi)容為了配合【延時加載】而誕生,貪婪加載和他本該在一起介紹,開發(fā)項目的過程中應(yīng)該雙管齊下,才能寫出高質(zhì)量的程序。
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>();這種映射支持單表/多表。
查找規(guī)則,查找屬性名,會循環(huán)內(nèi)部對象 _tables(join 查詢后會增長),以 主表優(yōu)先查,直到查到相同的字段。
如:
A, B, C 都有 id,Dto { id, a1, a2, b1, b2 },A.id 被映射。也可以指定 id = C.id 映射。
友情提醒:在 dto 可以直接映射一個導(dǎo)航屬性
導(dǎo)航屬性 ManyToOne/OneToOne
ManyToOne/OneToOne 導(dǎo)航屬性通過 ToList() 加載,這個方法有一個參數(shù):includeNestedMembers。
參數(shù)說明:
false: 返回 2級 Join 的數(shù)據(jù);
true: 返回所有層級深度 Join 的導(dǎo)航數(shù)據(jù);
如果查詢中已經(jīng)使用了 a.Parent.Parent 類似表達(dá)式,則可以無需 LeftJoin 等操作。
如:
Select<Tag>().Where(a => a.Parent.Name == "1").ToList(); //這樣寫,不需要再標(biāo)記 Join,解析表達(dá)式時自動處理成 LeftJoin如果導(dǎo)航屬性沒有使用,又想加載,可使用 Include 方法。
Select<Tag>().Include(a => a.Parent).ToList();導(dǎo)航屬性 OneToMany/ManyToMany
IncludeMany 貪婪加載集合的導(dǎo)航屬性,其實是分兩次查詢,在 ToList 后進(jìn)行了數(shù)據(jù)重裝。
Select<Tag>().IncludeMany(a => a.Songs).ToList(); //這是 ManyToMany 關(guān)系的貪婪加載OneToMany 的使用方法相同
IncludeMany 有第二個參數(shù),可以進(jìn)行二次查詢前的修飾工作。
Select<Tag>().IncludeMany(a => a.Songs, then => then.Where(song => song.User == "admin")).ToList();然后,其實在 then 那里,還可以繼續(xù)進(jìn)行向下 Include/IncludeMany。只要你喜歡,向下 100 層都沒問題。
變異
變異的 IncludeMany,即使選擇的不是導(dǎo)航屬性,也可以貪婪加載。
Select<Tag>().IncludeMany(a => a.TestManys.Where(b => b.TagId == a.Id));支持聯(lián)合鍵關(guān)系指定
比如 EFCore include 吧,如何只查詢每項子集合的前幾條數(shù)據(jù),它只可以加載所有導(dǎo)致IO性能低下(如果某些子集合,有100條,200條),FreeSql 可以解決這個問題。
Select<Tag>().IncludeMany(a => a.TestManys.Take(10));系列文章導(dǎo)航
(一)入門
(二)自動遷移實體
(三)實體特性
(四)實體特性 Fluent Api
(五)插入數(shù)據(jù)
(六)批量插入數(shù)據(jù)
(七)插入數(shù)據(jù)時忽略列
(八)插入數(shù)據(jù)時指定列
(九)刪除數(shù)據(jù)
(十)更新數(shù)據(jù)
(十一)更新數(shù)據(jù) Where
(十二)更新數(shù)據(jù)時指定列
(十三)更新數(shù)據(jù)時忽略列
(十四)批量更新數(shù)據(jù)
(十五)查詢數(shù)據(jù)
(十六)分頁查詢
(十七)聯(lián)表查詢
(十八)導(dǎo)航屬性
(十九)多表查詢
(二十)多表查詢 WhereCascade
(二十一)查詢返回數(shù)據(jù)
(二十二)Dto 映射查詢
(二十三)分組、聚合
(二十四)Linq To Sql 語法使用介紹
(二十五)延時加載
(二十六)貪婪加載 Include、IncludeMany、Dto、ToList
(二十七)將已寫好的 SQL 語句,與實體類映射進(jìn)行二次查詢
(二十八)事務(wù)
(二十九)Lambda 表達(dá)式
(三十)讀寫分離
(三十一)分區(qū)分表
(三十二)Aop
(三十三)CodeFirst 類型映射
(三十四)CodeFirst 遷移說明
(三十五)CodeFirst 自定義特性
轉(zhuǎn)載于:https://www.cnblogs.com/FreeSql/p/11531404.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的FreeSql (二十六)贪婪加载 Include、IncludeMany、Dto、ToList的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 挂靠
- 下一篇: 关于IIS 7.5 限制连接数与流量限制