前言

  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. npm之基本使用

    # 查看镜像源 npm config get registry # 设置镜像源 # 腾讯云 npm config set registry http://mirrors.cloud.tencent.c ...

  2. Android开发重要知识点

    一.网络 1.https原理 2.tcp/ip协议 三次握手:https://www.cnblogs.com/cenglinjinran/p/8482412.html 四次挥手:https://www ...

  3. 鸿蒙UI开发快速入门 —— part07:组件状态管理之@Prop/@Link装饰器

    1.前言 我们在上一章学习了@State装饰器,@State装饰器的作用范围仅仅在当前组件,接下来,我们讨论如何从父组件中传入参数到子组件,让子组件随着父组件的状态发生变化.本章将要介绍的就是:@Pr ...

  4. 注册美区 Apple ID 账号!都2020年了,你还没有一个自己的海外苹果ID?

    写在前面: 小伙伴们学腻了技术,不防今天来点大家都感兴趣的海外苹果 Apple ID 吧! 今天就教大家怎么注册美区 Apple ID,这个方法也是目前注册苹果美区  Apple ID  最快最简单的 ...

  5. Tomcat 已集成 CROS Fitler ExpiresFilter 等一堆常用 Filter

    http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html 再也不需要三方包提供的 filter 了

  6. 使用 ayncio 实现 CountDownLatch

    class CountDownLatch(object): def __init__(self, count=1): self.count = count self.lock = asyncio.Lo ...

  7. 【软件】【逆向】StarUML regist

    // 安装npm brew install node //安装打包工具 npm install asar -g C:\Program Files\StarUML\resources StarUML\r ...

  8. shell 读取文件内容到数组

    在 shell 脚本中,可以使用下面的语法来读取文件内容并将其存储到数组中:   bash 复制代码 array=() while read line; do array+=("$line& ...

  9. 【shell】远程执行shell|多节点并行执行shell|远程执行注意

    目录 前提条件 shell远程执行 多节点上并行执行命令的三种方法 方法1 使用bash执行命令 方法2 使用clustershell执行命令--还能收集结果 方法3 使用pdsh 执行命令 远程执行 ...

  10. JVM故障分析及性能优化系列之四:jstack生成的Thread Dump日志线程状态

    https://www.javatang.com/archives/2017/10/25/36441958.html JVM故障分析及性能优化系列文章 JVM故障分析及性能优化系列之一:使用jstac ...