类别:学习文档

日期:2021-07-15 浏览:1671 评论:0

FreeSql 支持导航属性延时加载,即当我们需要用到的时候才进行加载(读取),支持1对1、多对1、1对多、多对多关系的导航属性。

当我们希望浏览某条订单信息的时候,才显示其对应的订单详细记录时,我们希望使用延迟加载来实现,这样不仅加快的了 读取的效率,同时也避免加载不需要的数据。延迟加载通常用于foreach循环读取数据时。

那么我们在定义Model的时候,需要在属性前面添加virtual关键字。如下

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; }
}

延时加载功能默认被关闭的,使用此功能请时,请在申明处开启;

延时加载功能,依赖 FreeSql.Extensions.LazyLoading 包,请前往 nuget 下载;

static 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)) //监听SQL命令对象,在执行前
    .Build(); //请务必定义成 Singleton 单例模式
    
var order = fsql.Select<Order>().Where(a => a.OrderID == 1).ToOne(); 
//查询订单表

var orderDetail1 = order.OrderDetails; 
//第一次访问,查询数据库

var orderDetail2 = order.OrderDetails; 
//第二次访问,不查

var order1 = orderDetail1.FirstOrDefault(); 
//访问导航属性,此时不查数据库,因为 OrderDetails 查询出来的时候已填充了该属性

控制台输出内容:

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延时加载支持1对1、多对1、1对多、多对多关系的导航属性,前三者大小同异,以下我们单独介绍多对多关系。

多对多延时加载

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; }
}

如上有三个表,音乐、标签,以及他们的关系表。

var songs = fsql.Select<Song>().Limit(10).ToList();
 //取10条音乐
 
 var songs1 = songs.First().Tags; 
 //第一次访问,查询数据库
 
 var songs2 = Songs.First().Tags; 
 //第二次访问,不查

控制台输出内容:

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

总结

优点:只在需要的时候加载数据,不需要预先计划,避免了各种复杂的外连接、索引、视图操作带来的低效率问题。

缺陷:多次与DB交互,性能降低。

如果要在循环中使用数据,请使用贪婪加载,否则使用懒加载。

系列文章导航

FreeSql (一)入门及安装 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二)自动迁移实体 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (三)实体特性 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (四)实体特性 Fluent Api - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (五)插入数据 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (六)批量插入数据 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (七)插入数据时忽略列 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (八)插入数据时指定列 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (九)删除数据 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十)更新数据 - 学习文档 - 零一的世界 (vtzw.com)FreeSql (十一)更新数据 Where - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十二)更新数据时指定列 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十三)更新数据时忽略列 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十四)批量更新数据 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十五)查询数据 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十六)分页查询 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十七)联表查询 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十八)导航属性 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (十九)多表查询 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十)多表查询 WhereCascade - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十一)查询返回数据 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十二)Dto 映射查询 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十三)分组、聚合 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十四)Linq To Sql 语法使用介绍 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十五)延时加载 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十六)贪婪加载 Include、IncludeMany - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十七)将已写好的 SQL 语句,与实体类映射进行二次查询 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十八)事务 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (二十九)Lambda 表达式 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (三十)读写分离 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (三十一)分表分库 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (三十二)Aop - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (三十三)CodeFirst 类型映射 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (三十四)CodeFirst 迁移说明 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (三十五)CodeFirst 自定义特性 - 学习文档 - 零一的世界 (vtzw.com)

FreeSql (三十六)进阶 仓储系列文档 - 学习文档 - 零一的世界 (vtzw.com)


本文标题:FreeSql (二十五)延时加载
本文链接:https://vtzw.com/post/723.html
作者授权:除特别说明外,本文由 零一 原创编译并授权 零一的世界 刊载发布。
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。
 您阅读本篇文章共花了: 

 可能感兴趣的文章

评论区

发表评论 / 取消回复

必填

选填

选填

◎欢迎讨论,请在这里发表您的看法及观点。