• FreeSql学习笔记——10.贪婪加载


    前言

      FreeSql贪婪加载主要对应导航属性,将需要的数据一次加载出来,包括查询表的子表或者关联表的关联数据,用于一对一、一对多、多对一、多对多的关系数据查询,查询的时候一对一、多对一关系查询是可以看作一种结构(主数据带上一条附加数据),一对多、多对多合为一种结构(主数据带一个数据集)。

     

    一对一/多对一

      使用导航关系加载关联数据导航属性通过 ToList(includeNestedMembers: false) 加载,默认false, 返回 2 级 Join 的导航数据;true表示返回所有层级深度 Join 的导航数据,必须有导航属性
    _freeSql.Select<Student>().Include(a => a.Class).ToList(true);
    //SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId],
    //a__Class.[Id] as9, a__Class.[Name] as10
    //FROM[Student] a
    //LEFT JOIN[Class] a__Class ON a__Class.[Id] = a.[ClassId]
    
    _freeSql.Select<Student>().Where(a => a.Class.Id == 1).ToList(true);
    //SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId],
    //a__Class.[Id] as9, a__Class.[Name] as10
    //FROM[Student] a
    //LEFT JOIN[Class] a__Class ON a__Class.[Id] = a.[ClassId]
    //WHERE(a__Class.[Id] = 1)
     

    一对多/多对多

      使用IncludeMany()查询会产生两个sql语句,查询出两个结果集拼装在一起,从而实现贪婪加载
    _freeSql.Select<Class>()
        .IncludeMany(x => x.StudentList,then=>then
            .Where(s=>s.Name.StartsWith("小明")))
        .Where(x => x.Id == 1)
        .ToList();
    //SELECT a.[Id], a.[Name]
    //FROM[Class] a
    //WHERE(a.[Id] = 1)
    //SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
    //FROM[Student] a
    //WHERE(((a.[ClassId]) in (1))) AND(((a.[Name]) LIKE '小明%'))
     

    扩展

      无导航关系情况下主动设置字段关联,关联表在IncludeMany()中写查询条件,查询字段等;这种方式与上一种差不多,主要在于无导航属性,需要加上关联字段
    _freeSql.Select<Class>()
                    .IncludeMany(x=>x.StudentList
                        .Where(s=>s.ClassId==x.Id)
                        .Select(a=>new Student{ Name= a.Name })
                    .Take(10))
                    .Where(x => x.Id == 1)
                    .ToList();
    //SELECT a.[Id], a.[Name]
    //FROM[Class] a
    //WHERE(a.[Id] = 1)
    //SELECT TOP 10 a.[Name] as1, a.[ClassId] as2
    //FROM[Student] a
    //WHERE((a.[ClassId] = 1))
     
     切记使用贪婪加载方式,如果关联数据是一条记录,那么会jion两个表查询,如果关联数据是一个数据集,那么会执行两次sql,一次查询主数据,一次根据关联字段查询关联数据
      与延迟加载相反,贪婪加载查询效率、数据库交互频率会低于延迟加载。
     
     
     
     
     
     
     
  • 相关阅读:
    迁移服务器遇到django-crontab不执行定时任务问题
    纯CSS3+DIV实现小三角形边框
    mysql密码错误-ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passwor:yes)
    收货地址下边的平行四边形彩色线条
    小程序导航栏全屏navigationStyle自定义导航栏,小程序轮播图导航栏
    移动宽带下Github网页上不去的解决办法
    线段比例式或等积式的证明思路
    两角不等的证明思路
    线段不等的证明思路
    两角相等的证明思路
  • 原文地址:https://www.cnblogs.com/zousc/p/16329294.html
Copyright © 2020-2023  润新知