日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

FreeSql (二十五)延时加载

發(fā)布時(shí)間:2023/12/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FreeSql (二十五)延时加载 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。