• FreeSql学习笔记——9.延时加载


    前言

      使用过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查询,获取到关联数据

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

  • 相关阅读:
    Debian如何永久添加静态路由
    一句话换个说法的软件
    高级程序员简历,技术总监喜欢什么简历?
    CP936实际上是GBK,编码问题再次让我熬夜
    句子说法转换的软件,基于AI技术
    输入关键词自动生成文章(2020年人工智能写作)
    自动写文章的智能软件(基于AI写作)
    python调用接口,python接收post请求接口(附完整代码)
    人工智能是铁饭碗还是铁坑,看看人工智能博士怎么说
    远离外包公司,就是远离码农的血汗工厂
  • 原文地址:https://www.cnblogs.com/zousc/p/16318534.html
Copyright © 2020-2023  润新知