前言

  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. ArkTs布局入门02——弹性布局(Flex)

    1.概述 弹性布局(Flex)提供更加有效的方式对容器中的子元素进行排列.对齐和分配剩余空间.容器默认存在主轴与交叉轴,子元素默认沿主轴排列,子元素在主轴方向的尺寸称为主轴尺寸,在交叉轴方向的尺寸称为 ...

  2. 【报错解决】使用代理后从Github中clone仓库报错

    当电脑使用代理后,会造成Github的clone和push等功能无法正常使用 报错内容:Failed to connect to github.com port 443 after ***** ms: ...

  3. PDFSharp - Graphics

    PDFSharp - Graphics Graphics - PDFsharp and MigraDoc Wiki 所有的 Graphics 类型都设计成模仿来自 System.Drawing 命名空 ...

  4. 在 ASP.NET Core 2.1 之后与 HttpClient 工厂一起使用 Polly

    在 ASP.NET Core 2.1 之后与 HttpClient 工厂一起使用 Polly 在 ASP.NET Core 2.1 中提供的 HttpClient factory 提供了一种预配置 H ...

  5. 龙哥量化:通达信(KT交易师)分时图主图叠加5分钟K线图

    股友要求在通达信分时图主图叠加5分钟K线,但是通达信的分时图取不到最高价,最低价等数据,限制非常多. 然后我在KT交易师上写的公式测试成功了,效果如下. 如果您需要公式源码或者代写公式, 请联系我. ...

  6. 欧拉OpenEuler安装MySQL8

    1. 安装mysql tar -xvf mysql-8.0.21-linux-glibc2.12-x86_64.tar mv mysql-8.0.21-linux-glibc2.12-x86_64 / ...

  7. 【OpenCV】features2d_converters.cpp:2:10: fatal error: common.h: 没有那个文件或目录

    Linux环境下使用opencv的dnn模块调用yolov4遇到的坑(纯CPU)一.问题描述Ubuntu安装opencv4.4,第一次编译完成安装成功,发现编译时少加了几个选项,于是重新编译,结果报如 ...

  8. Pycharm IDE中导入和移除python项目

    1.Pycharm导入python项目 进入PyCharm后,点击File→Open,然后在弹窗中选择需要导入项目的文件夹: 打开了python项目后,需要配置该项目对应的python才可以正常运行: ...

  9. 有道云笔记默认的笔记格式转markdown

    目录 0. 前言 1. 有道云笔记自带的笔记格式转markdown的方案 1.1 pdf => md 1.2 pdf => word => md 2. Markdown技巧 2.1 ...

  10. 深入解析 Spring AI 系列:剖析OpenAI接口接入组件

    今天我们将继续探讨如何在Spring AI中接入大语言模型,以OpenAI为例,详细分析其接入过程.我们将逐步探讨OpenAI是如何与Spring AI系统对接的,具体包括如何配置接口.如何封装接口参 ...