1. 程式人生 > 其它 >FreeSql學習筆記——10.貪婪載入

FreeSql學習筆記——10.貪婪載入

前言

  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()中寫查詢條件,查詢欄位等;這種方式與上一種差不多,主要在於無導航屬性,需要加上關聯欄位
_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))
    切記使用貪婪載入方式,如果關聯資料是一條記錄,那麼會jion兩個表查詢,如果關聯資料是一個數據集,那麼會執行兩次sql,一次查詢主資料,一次根據關聯欄位查詢關聯資料   與延遲載入相反,貪婪載入查詢效率、資料庫互動頻率會低於延遲載入。