FreeSql 支持導(dǎo)航屬性延時加載,即當(dāng)我們需要用到的時候才進(jìn)行加載(讀?。?,支持1對1、多對1、1對多、多對多關(guān)系的導(dǎo)航屬性。
當(dāng)我們希望瀏覽某條訂單信息的時候,才顯示其對應(yīng)的訂單詳細(xì)記錄時,我們希望使用延遲加載來實(shí)現(xiàn),這樣不僅加快的了
讀取的效率,同時也避免加載不需要的數(shù)據(jù)。延遲加載通常用于foreach循環(huán)讀取數(shù)據(jù)時。
那么我們在定義Model的時候,需要在屬性前面添加virtual關(guān)鍵字。如下
public class Order { [Column(IsPrimary = true)] public int OrderID { get; set;
} public string OrderTitle { get; set; } public string CustomerName { get; set;
} public DateTime TransactionDate { get; set; } public virtual
List<OrderDetail> OrderDetails { get; set; } } public class OrderDetail {
[Column(IsPrimary = true)] public int DetailId { get; set; } public int OrderId
{ get; set; } public virtual Order Order { get; set; } }
延時加載功能默認(rèn)被關(guān)閉的,使用此功能請時,請?jiān)谏昝魈庨_啟;
延時加載功能,依賴 FreeSql.Extensions.LazyLoading 包,請前往 nuget 下載;
IFreeSql fsql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.MySql, "Data
Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial
Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10")
.UseLazyLoading(true) //開啟延時加載功能 .UseMonitorCommand( cmd =>
Console.WriteLine(cmd.CommandText)) //監(jiān)聽SQL命令對象,在執(zhí)行前 .Build(); var order =
fsql.Select<Order>().Where(a => a.OrderID == 1).ToOne(); //查詢訂單表 var
orderDetail1 = order.OrderDetails; //第一次訪問,查詢數(shù)據(jù)庫 var orderDetail2 =
order.OrderDetails; //第二次訪問,不查 var order1 = orderDetail1.FirstOrDefault();
//訪問導(dǎo)航屬性,此時不查數(shù)據(jù)庫,因?yàn)?OrderDetails 查詢出來的時候已填充了該屬性
控制臺輸出內(nèi)容:
SELECT a.`OrderID`, a.`OrderTitle`, a.`CustomerName`, a.`TransactionDate` FROM
`Order` a WHERE (a.`OrderID` = 1) limit 0,1 SELECT a.`DetailId`, a.`OrderId`
FROM `OrderDetail` a WHERE (a.`OrderId` = 1)
FreeSql延時加載支持1對1、多對1、1對多、多對多關(guān)系的導(dǎo)航屬性,前三者大小同異,以下我們單獨(dú)介紹多對多關(guān)系。
多對多延時加載
public partial class Song { [Column(IsIdentity = true)] public int Id { get;
set; } public DateTime? Create_time { get; set; } public bool? Is_deleted {
get; set; } public string Title { get; set; } public string Url { get; set; }
public virtual ICollection<Tag> Tags { get; set; } } public partial class
Song_tag { public int Song_id { get; set; } public virtual Song Song { get;
set; } public int Tag_id { get; set; } public virtual Tag Tag { get; set; } }
public partial class Tag { [Column(IsIdentity = true)] public int Id { get;
set; } public int? Parent_id { get; set; } public virtual Tag Parent { get;
set; } public decimal? Ddd { get; set; } public string Name { get; set; }
public virtual ICollection<Song> Songs { get; set; } }
如上有三個表,音樂、標(biāo)簽,以及他們的關(guān)系表。
var songs = fsql.Select<Song>().Limit(10).ToList(); //取10條音樂 var songs1 =
songs.First().Tags; //第一次訪問,查詢數(shù)據(jù)庫 var songs2 = Songs.First().Tags; //第二次訪問,不查
控制臺輸出內(nèi)容:
SELECT a.`Id`, a.`Create_time`, a.`Is_deleted`, a.`Title`, a.`Url` FROM `Song`
a limit 0,10 SELECT a.`Id`, a.`Parent_id`, a.`Ddd`, a.`Name` FROM `Tag` a WHERE
(exists(SELECT 1 FROM `Song_tag` b WHERE (b.`Song_id` = 2 AND b.`Tag_id` =
a.`Id`) limit 0,1))
總結(jié)
優(yōu)點(diǎn):只在需要的時候加載數(shù)據(jù),不需要預(yù)先計(jì)劃,避免了各種復(fù)雜的外連接、索引、視圖操作帶來的低效率問題。
缺陷:多次與DB交互,性能降低。
如果要在循環(huán)中使用數(shù)據(jù),請使用貪婪加載,否則使用懶加載。
系列文章導(dǎo)航
*
(一)入門 <https://www.cnblogs.com/FreeSql/p/11531300.html>
*
(二)自動遷移實(shí)體 <https://www.cnblogs.com/FreeSql/p/11531301.html>
*
(三)實(shí)體特性 <https://www.cnblogs.com/FreeSql/p/11531302.html>
*
(四)實(shí)體特性 Fluent Api <https://www.cnblogs.com/FreeSql/p/11531304.html>
*
(五)插入數(shù)據(jù) <https://www.cnblogs.com/FreeSql/p/11531306.html>
*
(六)批量插入數(shù)據(jù) <https://www.cnblogs.com/FreeSql/p/11531309.html>
*
(七)插入數(shù)據(jù)時忽略列 <https://www.cnblogs.com/FreeSql/p/11531316.html>
*
(八)插入數(shù)據(jù)時指定列 <https://www.cnblogs.com/FreeSql/p/11531318.html>
*
(九)刪除數(shù)據(jù) <https://www.cnblogs.com/FreeSql/p/11531320.html>
*
(十)更新數(shù)據(jù) <https://www.cnblogs.com/FreeSql/p/11531321.html>
*
(十一)更新數(shù)據(jù) Where <https://www.cnblogs.com/FreeSql/p/11531324.html>
*
(十二)更新數(shù)據(jù)時指定列 <https://www.cnblogs.com/FreeSql/p/11531327.html>
*
(十三)更新數(shù)據(jù)時忽略列 <https://www.cnblogs.com/FreeSql/p/11531334.html>
*
(十四)批量更新數(shù)據(jù) <https://www.cnblogs.com/FreeSql/p/11531335.html>
*
(十五)查詢數(shù)據(jù) <https://www.cnblogs.com/FreeSql/p/11531339.html>
*
(十六)分頁查詢 <https://www.cnblogs.com/FreeSql/p/11531341.html>
*
(十七)聯(lián)表查詢 <https://www.cnblogs.com/FreeSql/p/11531346.html>
*
(十八)導(dǎo)航屬性 <https://www.cnblogs.com/FreeSql/p/11531352.html>
*
(十九)多表查詢 <https://www.cnblogs.com/FreeSql/p/11531362.html>
*
(二十)多表查詢 WhereCascade <https://www.cnblogs.com/FreeSql/p/11531372.html>
*
(二十一)查詢返回數(shù)據(jù) <https://www.cnblogs.com/FreeSql/p/11531376.html>
*
(二十二)Dto 映射查詢 <https://www.cnblogs.com/FreeSql/p/11531381.html>
*
(二十三)分組、聚合 <https://www.cnblogs.com/FreeSql/p/11531384.html>
*
(二十四)Linq To Sql 語法使用介紹 <https://www.cnblogs.com/FreeSql/p/11531392.html>
*
(二十五)延時加載
*
(二十六)貪婪加載 Include、IncludeMany、Dto、ToList
<https://www.cnblogs.com/FreeSql/p/11531404.html>
*
(二十七)將已寫好的 SQL 語句,與實(shí)體類映射進(jìn)行二次查詢
<https://www.cnblogs.com/FreeSql/p/11531416.html>
*
(二十八)事務(wù) <https://www.cnblogs.com/FreeSql/p/11531423.html>
*
(二十九)Lambda 表達(dá)式 <https://www.cnblogs.com/FreeSql/p/11531425.html>
*
(三十)讀寫分離 <https://www.cnblogs.com/FreeSql/p/11531430.html>
*
(三十一)分區(qū)分表 <https://www.cnblogs.com/FreeSql/p/11531435.html>
*
(三十二)Aop <https://www.cnblogs.com/FreeSql/p/11531471.html>
*
(三十三)CodeFirst 類型映射 <https://www.cnblogs.com/FreeSql/p/11531543.html>
*
(三十四)CodeFirst 遷移說明 <https://www.cnblogs.com/FreeSql/p/11531550.html>
*
(三十五)CodeFirst 自定義特性 <https://www.cnblogs.com/FreeSql/p/11531576.html>
熱門工具 換一換