前言

  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,一次查询主数据,一次根据关联字段查询关联数据
  与延迟加载相反,贪婪加载查询效率、数据库交互频率会低于延迟加载。
 
 
 
 
 
 
 

FreeSql学习笔记——10.贪婪加载的更多相关文章

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

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

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

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

  3. 学习EF之贪婪加载和延迟加载(1)

    从暑假开始接触code first以来,一直感觉很好用,主要在于开发过程中以业务为中心可以随时修改数据模型生成数据库,还有一个原因就是查询起来很方便 这里找了一个以前database first的一段 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Lombok 代码优化器

    Lombok是一种Java实用工具,可用来帮助开发人员消除Java的冗长代码,尤其是对于简单的Java对象(POJO).它通过注释实现这一目的 使用安装Lombok pom文件导入lombok Mav ...

  2. 语音转文字-Microsoft Azure Speech Service与Web Speech API实战

    简介 在现代技术驱动的世界中,语音识别已成为人机交互的重要方式.Microsoft Azure Speech Service 提供了强大的语音转文本功能,允许开发者轻松地将语音数据转换为文本.本文将指 ...

  3. Mysql8.0修改配置参数lower_case_table_names

    现象 今天在配置一个环境的数据库,所使用的系统要求该数据库 lower_case_table_names = 1 (对数据库表明.列名大小写不敏感) 我看了一下,在 Windows 上,默认值为 1. ...

  4. 使用 Autofac, MediatR 和 FluentValidator 构建松耦合 ASP.NET Core API 应用

    使用 MediatR 和 FluentValidator 1. 创建示例文件夹 Sample 首先,创建示例文件夹 Sample. 2. 创建表示层项目 Web 在示例文件夹 Sample 中,使用标 ...

  5. 部署docker-registry+ui shell 域名证书-用户认证

    #部署docker-registry+ui shell docker registry 配置域名证书, 用户密码认证, 轻量UI ansible部署docker-registry+ui https:/ ...

  6. ChatGPT生成接口测试用例(二)

    5.1.4 自动生成测试数据 测试数据的生成通常是接口测试的一个烦琐任务.ChatGPT可以帮助测试团队生成测试数据,包括各种输入和它们的组合.测试人员可以描述他们需要的数据类型和范围,ChatGPT ...

  7. ctr命令的基本使用与技巧

    k8s早1.24后放弃docker,并把containerd作为运行时组件,containerd 调用链更短,组件更少,更稳定,占用节点资源更少 ctr是containerd的一个客户端工具 cric ...

  8. Linux下修改文件所属用户和组

    chgrp  用户名    文件名  -R chown 用户名   文件名  -R -R表示递归目录下所有文件 以上部分已验证 一.修改文件所属组群--chgrp    修改文件所属组群很简单-chg ...

  9. Exception:统一异常处理

    异常包括:全局异常.特定异常和自定义异常. 第一步,创建一个异常处理类,并在类上添加 @ControllerAdvice 注解 第二步,在类中添加出现异常时要执行的方法,并在方法上添加对应注解,指定出 ...

  10. Qt编写地图综合应用24-miniblink内核

    一.前言 用Qt做项目过程中,遇到需要用到浏览器控件的项目,可能都会绕不开一个问题,那就是从Qt5.6版本开始mingw编译器的Qt构建套件,不再提供浏览器控件了,之前还可以用webkit控件,这下很 ...