FreeSql學習筆記——10.貪婪載入
阿新 • • 發佈:2022-05-31
前言
FreeSql貪婪載入主要對應導航屬性,將需要的資料一次加載出來,包括查詢表的子表或者關聯表的關聯資料,用於一對一、一對多、多對一、多對多的關係資料查詢,查詢的時候一對一、多對一關係查詢是可以看作一種結構(主資料帶上一條附加資料),一對多、多對多合為一種結構(主資料帶一個數據集)。
一對一/多對一
使用導航關係載入關聯資料導航屬性通過 ToList(includeNestedMembers: false) 載入,預設false, 返回 2 級 Join 的導航資料;true表示返回所有層級深度 Join 的導航資料,必須有導航屬性_freeSql.Select<Student>().Include(a => a.Class).ToList(true); //SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId], //a__Class.[Id] as9, a__Class.[Name] as10 //FROM[Student] a //LEFT JOIN[Class] a__Class ON a__Class.[Id] = a.[ClassId] _freeSql.Select<Student>().Where(a => a.Class.Id == 1).ToList(true); //SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId], //a__Class.[Id] as9, a__Class.[Name] as10 //FROM[Student] a //LEFT JOIN[Class] a__Class ON a__Class.[Id] = a.[ClassId] //WHERE(a__Class.[Id] = 1)
一對多/多對多
使用IncludeMany()查詢會產生兩個sql語句,查詢出兩個結果集拼裝在一起,從而實現貪婪載入_freeSql.Select<Class>() .IncludeMany(x => x.StudentList,then=>then .Where(s=>s.Name.StartsWith("小明"))) .Where(x => x.Id == 1) .ToList(); //SELECT a.[Id], a.[Name] //FROM[Class] a //WHERE(a.[Id] = 1) //SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId] //FROM[Student] a //WHERE(((a.[ClassId]) in (1))) AND(((a.[Name]) LIKE '小明%'))
擴充套件
無導航關係情況下主動設定欄位關聯,關聯表在IncludeMany()中寫查詢條件,查詢欄位等;這種方式與上一種差不多,主要在於無導航屬性,需要加上關聯欄位切記使用貪婪載入方式,如果關聯資料是一條記錄,那麼會jion兩個表查詢,如果關聯資料是一個數據集,那麼會執行兩次sql,一次查詢主資料,一次根據關聯欄位查詢關聯資料 與延遲載入相反,貪婪載入查詢效率、資料庫互動頻率會低於延遲載入。_freeSql.Select<Class>() .IncludeMany(x=>x.StudentList .Where(s=>s.ClassId==x.Id) .Select(a=>new Student{ Name= a.Name }) .Take(10)) .Where(x => x.Id == 1) .ToList(); //SELECT a.[Id], a.[Name] //FROM[Class] a //WHERE(a.[Id] = 1) //SELECT TOP 10 a.[Name] as1, a.[ClassId] as2 //FROM[Student] a //WHERE((a.[ClassId] = 1))