FreeSql (二十五)延时加载
FreeSql 支持導(dǎo)航屬性延時(shí)加載,即當(dāng)我們需要用到的時(shí)候才進(jìn)行加載(讀取),支持1對(duì)1、多對(duì)1、1對(duì)多、多對(duì)多關(guān)系的導(dǎo)航屬性。
當(dāng)我們希望瀏覽某條訂單信息的時(shí)候,才顯示其對(duì)應(yīng)的訂單詳細(xì)記錄時(shí),我們希望使用延遲加載來(lái)實(shí)現(xiàn),這樣不僅加快的了 讀取的效率,同時(shí)也避免加載不需要的數(shù)據(jù)。延遲加載通常用于foreach循環(huán)讀取數(shù)據(jù)時(shí)。
那么我們?cè)诙xModel的時(shí)候,需要在屬性前面添加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; } }延時(shí)加載功能默認(rèn)被關(guān)閉的,使用此功能請(qǐng)時(shí),請(qǐng)?jiān)谏昝魈庨_(kāi)啟;
延時(shí)加載功能,依賴(lài) FreeSql.Extensions.LazyLoading 包,請(qǐng)前往 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) //開(kāi)啟延時(shí)加載功能.UseMonitorCommand(cmd => Console.WriteLine(cmd.CommandText)) //監(jiān)聽(tīng)SQL命令對(duì)象,在執(zhí)行前.Build();var order = fsql.Select<Order>().Where(a => a.OrderID == 1).ToOne(); //查詢訂單表 var orderDetail1 = order.OrderDetails; //第一次訪問(wèn),查詢數(shù)據(jù)庫(kù) var orderDetail2 = order.OrderDetails; //第二次訪問(wèn),不查 var order1 = orderDetail1.FirstOrDefault(); //訪問(wèn)導(dǎo)航屬性,此時(shí)不查數(shù)據(jù)庫(kù),因?yàn)?OrderDetails 查詢出來(lái)的時(shí)候已填充了該屬性控制臺(tái)輸出內(nèi)容:
SELECT a.`OrderID`, a.`OrderTitle`, a.`CustomerName`, a.`TransactionDate` FROM `Order` a WHERE (a.`OrderID` = 1) limit 0,1SELECT a.`DetailId`, a.`OrderId` FROM `OrderDetail` a WHERE (a.`OrderId` = 1)FreeSql延時(shí)加載支持1對(duì)1、多對(duì)1、1對(duì)多、多對(duì)多關(guān)系的導(dǎo)航屬性,前三者大小同異,以下我們單獨(dú)介紹多對(duì)多關(guān)系。
多對(duì)多延時(shí)加載
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; } }如上有三個(gè)表,音樂(lè)、標(biāo)簽,以及他們的關(guān)系表。
var songs = fsql.Select<Song>().Limit(10).ToList(); //取10條音樂(lè) var songs1 = songs.First().Tags; //第一次訪問(wèn),查詢數(shù)據(jù)庫(kù) var songs2 = Songs.First().Tags; //第二次訪問(wèn),不查控制臺(tái)輸出內(nèi)容:
SELECT a.`Id`, a.`Create_time`, a.`Is_deleted`, a.`Title`, a.`Url` FROM `Song` a limit 0,10SELECT 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í)候加載數(shù)據(jù),不需要預(yù)先計(jì)劃,避免了各種復(fù)雜的外連接、索引、視圖操作帶來(lái)的低效率問(wèn)題。
缺陷:多次與DB交互,性能降低。
如果要在循環(huán)中使用數(shù)據(jù),請(qǐng)使用貪婪加載,否則使用懶加載。
系列文章導(dǎo)航
(一)入門(mén)
(二)自動(dòng)遷移實(shí)體
(三)實(shí)體特性
(四)實(shí)體特性 Fluent Api
(五)插入數(shù)據(jù)
(六)批量插入數(shù)據(jù)
(七)插入數(shù)據(jù)時(shí)忽略列
(八)插入數(shù)據(jù)時(shí)指定列
(九)刪除數(shù)據(jù)
(十)更新數(shù)據(jù)
(十一)更新數(shù)據(jù) Where
(十二)更新數(shù)據(jù)時(shí)指定列
(十三)更新數(shù)據(jù)時(shí)忽略列
(十四)批量更新數(shù)據(jù)
(十五)查詢數(shù)據(jù)
(十六)分頁(yè)查詢
(十七)聯(lián)表查詢
(十八)導(dǎo)航屬性
(十九)多表查詢
(二十)多表查詢 WhereCascade
(二十一)查詢返回?cái)?shù)據(jù)
(二十二)Dto 映射查詢
(二十三)分組、聚合
(二十四)Linq To Sql 語(yǔ)法使用介紹
(二十五)延時(shí)加載
(二十六)貪婪加載 Include、IncludeMany、Dto、ToList
(二十七)將已寫(xiě)好的 SQL 語(yǔ)句,與實(shí)體類(lèi)映射進(jìn)行二次查詢
(二十八)事務(wù)
(二十九)Lambda 表達(dá)式
(三十)讀寫(xiě)分離
(三十一)分區(qū)分表
(三十二)Aop
(三十三)CodeFirst 類(lèi)型映射
(三十四)CodeFirst 遷移說(shuō)明
(三十五)CodeFirst 自定義特性
轉(zhuǎn)載于:https://www.cnblogs.com/FreeSql/p/11531395.html
總結(jié)
以上是生活随笔為你收集整理的FreeSql (二十五)延时加载的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 我遇到的Quartus II警告及原因—
- 下一篇: 使用子查询进行编号重排的处理示例.sql