前言

  使用过EF都知道延时加载,延时加载即需要用到数据的时候才去数据库读取数据,这样做的好处是只有诗句真正被用到的时候才会执行sql语句读取数据库数据,避免了加载不去要的数据,同时也提升了数据度的效率;
但是缺点也很明显,就是需要多次与数据库交互,导致性能降低,怎么使用需要结合场景考虑。
  FreeSql 支持导航属性延时加载,即当我们需要用到的时候才进行加载(读取),支持 1 对 1、多对 1、1 对多、多对多关系的导航属性。
  FreeSql的延时加载功能依赖于 FreeSql.Extensions.LazyLoading 包,默认是关闭的,如果使用此功能,需要在申明处开启,在定义Model是需要在属性前面添加virtual关键字。
 
Init
  先引入FreeSql.Extensions.LazyLoading包

  然后修改下StartUp

IFreeSql freeSql = new FreeSqlBuilder()
.UseConnectionString(DataType.SqlServer, Configuration.GetConnectionString("SqlServerConnection"))
.UseAutoSyncStructure(true)
.UseLazyLoading(true) //开启延时加载功能
.UseMonitorCommand(cmd => Console.WriteLine(cmd.CommandText))
.Build();

  接着就是在实体中新增导航属性virtual关键字

Class
public class Class
{
[Column(IsIdentity = true, IsPrimary = true)]
public long Id { get; set; } [Column(IsNullable = false, DbType = "varchar(20)")]
public string Name { get; set; } public virtual List<Student> StudentList { get; set; }
}
Student
public class Student
{
[Column(IsIdentity = true, IsPrimary = true)]
public long Id { get; set; } [Column(IsNullable = false, DbType = "varchar(20)")]
public string Name { get; set; } public int Age { get; set; } public StatusEnum Status { get; set; } public DateTime AddTime { get; set; } [Column(IsNullable =true,DbType = "varchar(100)")]
public string Remark { get; set; } [Column(IsVersion = true)]
public long Version { get; set; } public long ClassId { get; set; } public virtual Class Class { get; set; }
}

示例

  在未开启延时加载前,查询Class时,会得到一个为Null的StudentList,因为查询出Class后并未给StudentList赋值;

var classOne = _freeSql.Select<Class>().First();
Console.WriteLine($"StudentList==Null:{classOne.StudentList == null}"); if (classOne.StudentList != null)
{
var student = classOne.StudentList.FirstOrDefault();
}

而在开启懒加载后,除了StudentList以外的

StudentList = 函数求值需要运行所有线程。

当使用到StudentList的时候会执行一个sql查询,获取到关联数据

  可以看到懒加载是在值被使用到的时候才会加载出来,每次加载只加载出需要的数据,从而提升了获取数据的效率,也提升了与数据库的交互。

FreeSql学习笔记——9.延时加载的更多相关文章

  1. thinkphp学习笔记9—自动加载

    原文:thinkphp学习笔记9-自动加载 1.命名空间自动加载 在3.2版本中不需要手动加载类库文件,可以很方便的完成自动加载. 系统可以根据类的命名空间自动定位到类库文件,例如定义了一个类Org\ ...

  2. node 学习笔记 - Modules 模块加载系统 (1)

    本文同步自我的个人博客:http://www.52cik.com/2015/12/11/learn-node-modules-path.html 用了这么久的 require,但却没有系统的学习过 n ...

  3. Openstack本学习笔记——Neutron-server服务加载和启动源代码分析(三)

    本文是在学习Openstack过程中整理和总结.因为时间和个人能力有限.错误之处在所难免,欢迎指正! 在Neutron-server服务载入与启动源代码分析(二)中搞定模块功能的扩展和载入.我们就回到 ...

  4. Spring学习笔记(1)——资源加载

    <!-- 占坑,迟点补充底层原理 --> Spring支持4种资源的地址前缀 (1)从类路径中加载资源——classpath: classpath:和classpath:/是等价的,都是相 ...

  5. node 学习笔记 - Modules 模块加载系统 (2)

    本文同步自我的个人博客:http://www.52cik.com/2015/12/14/learn-node-modules-module.html 上一篇讲了模块是如何被寻找到然后加载进来的,这篇则 ...

  6. 【EF学习笔记08】----------加载关联表的数据 显式加载

    显式加载 讲解之前,先来看一下我们的数据库结构:班级表 学生表 加载从表集合类型 //显示加载 Console.WriteLine("=========查询集合===========&quo ...

  7. 【EF学习笔记07】----------加载关联表的数据 贪婪加载

    讲解之前,先来看一下我们的数据库结构:班级表 学生表 贪婪加载 //贪婪加载 using (var db = new Entities()) { var classes = db.Classes.Wh ...

  8. 【EF学习笔记06】----------加载关联表的数据 延迟加载

    讲解之前,先来看一下我们的数据库结构:班级表 学生表 延迟加载 //延迟加载 using (var db = new Entities()) { //查询班级 var classes = (from ...

  9. webpack学习笔记--按需加载

    为什么需要按需加载 随着互联网的发展,一个网页需要承载的功能越来越多. 对于采用单页应用作为前端架构的网站来说,会面临着一个网页需要加载的代码量很大的问题,因为许多功能都集中的做到了一个 HTML 里 ...

  10. Office365学习笔记—Lookup类型加载条目过多解决方案

    1,随着接触的项目越来越多,遇到的各种奇葩的问题也越来越多,不得不说,SharePoint是个好东西,提高了开发效率,简化了很多基础的功能.但是令人头疼的问题是,当你想做个稍微复杂点的功能,就不得不研 ...

随机推荐

  1. SFE人才需要具备哪些能力

    SFE(销售队伍效力)人才在企业中扮演着至关重要的角色,他们需要具备一系列的能力来确保销售队伍的高效运作和业绩提升.关于SFE的角色和能力,可以从业务理解.数据洞察.向上管理以及效率提升等几个方面来通 ...

  2. openEuler欧拉安装Jenkins并修改构建workspace路径

    ​一.系统优化 关闭防火墙 systemctl stop firewalld systemctl disable firewalld 关闭selinux sed -ri 's/SELINUX=enfo ...

  3. CMake构建学习笔记19-OpenSSL库的构建

    1. 概述 OpenSSL是一个开源的加密工具包和库,主要实现了安全套接字层(SSL)和传输层安全(TLS)协议,以及各种加密算法.数字签名.消息摘要.加密证书等功能.这个库可以说是Web开发尤其是H ...

  4. Qt编写安防视频监控系统54-轮询配置

    一.前言 视频监控系统中少不了用到视频轮询,按照设计的基本原则,先满足基本的用户需求,稳定跑起来,再去折腾更复杂的应用场景,于是本系统也做了个基本的视频轮询功能,可以设置轮询方案,给某个轮询方案设置轮 ...

  5. Qt音视频开发8-ffmpeg保存裸流

    一.前言 最开始做的ffmpeg保存视频文件,就是直接保存的裸流数据,裸流数据一般是H264格式的数据,这种数据文件可以用部分播放器播放,由于不是标准的格式,很多播放器其实不支持的,需要安装对应的解码 ...

  6. 生产环境Sentinel改造实践(一):Sentinel核心概念

    一.前言 本文主要是对sentinel-dashboard源码进行改造,用在生产环境保障其高可用,主要改造点如下: 接入nacos支持规则管理及推送 监控数据存入influxDb,后续可开发对应的监控 ...

  7. 在C#中如何设置DateTimePicker控件显示“年-月-日 时:分:秒”的格式

    在C#中DateTimePicker控件默认显示的日期格式为"年-月-日",并未显示"时:分:秒",如何设置DateTimePicker控件显示"年- ...

  8. 自动化测试工具-Katalon Studio

              Katalon 代码片段: 1)if(WebUI.verifyTextPresent(findTestObject('Page_Skin/p_Are you ok?'),10,Fa ...

  9. G1原理—4.G1垃圾回收的过程之Young GC

    大纲 1.G1的YGC过程 2.YGC并行处理阶段的过程 3.YGC串行处理阶段的过程(一) 4.YGC串行处理阶段的过程(二) 5.整个YGC的执行流程总结 1.G1的YGC过程 (1)YGC相关的 ...

  10. 一个超经典 WinForm,WPF 卡死问题的终极反思

    一:背景 1. 讲故事 写这篇文章起源于训练营里一位朋友最近在微信聊到他对这个问题使用了一种非常切实可行,简单粗暴的方式,并且也成功解决了公司里几个这样的卡死dump,如今在公司已是灵魂级人物,让我也 ...