FreeSql (二十六)贪婪加载 Include、IncludeMany、Dto、ToList

贪婪加载顾名思议就是把所有要加载的东西一次性读取。

本节内容为了配合【延时加载】而诞生,贪婪加载和他本该在一起介绍,开发项目的过程中应该双管齐下,才能写出高质量的程序。

Dto 映射查询

Select<Tag>().Limit(10).ToList(a => new TestDto { id = a.Id, name = a.Title });
Select<Tag>().Limit(10).ToList(a => new TestDto());
Select<Tag>().Limit(10).ToList(a => new TestDto { });
Select<Tag>().Limit(10).ToList(a => new TestDto() { });
Select<Tag>().Limit(10).ToList<TestDto>();

这种映射支持单表/多表。

查找规则,查找属性名,会循环内部对象 _tables(join 查询后会增长),以 主表优先查,直到查到相同的字段。

如:

A, B, C 都有 id,Dto { id, a1, a2, b1, b2 },A.id 被映射。也可以指定 id = C.id 映射。

友情提醒:在 dto 可以直接映射一个导航属性

导航属性 ManyToOne/OneToOne

ManyToOne/OneToOne 导航属性通过 ToList() 加载,这个方法有一个参数:includeNestedMembers。

参数说明:

false: 返回 2级 Join 的数据;

true: 返回所有层级深度 Join 的导航数据;

如果查询中已经使用了 a.Parent.Parent 类似表达式,则可以无需 LeftJoin 等操作。

如:

Select<Tag>().Where(a => a.Parent.Name == "1").ToList();
//这样写,不需要再标记 Join,解析表达式时自动处理成 LeftJoin

如果导航属性没有使用,又想加载,可使用 Include 方法。

Select<Tag>().Include(a => a.Parent).ToList();

导航属性 OneToMany/ManyToMany

IncludeMany 贪婪加载集合的导航属性,其实是分两次查询,在 ToList 后进行了数据重装。

Select<Tag>().IncludeMany(a => a.Songs).ToList();
//这是 ManyToMany 关系的贪婪加载

OneToMany 的使用方法相同

IncludeMany 有第二个参数,可以进行二次查询前的修饰工作。

Select<Tag>().IncludeMany(a => a.Songs,
    then => then.Where(song => song.User == "admin")).ToList();

然后,其实在 then 那里,还可以继续进行向下 Include/IncludeMany。只要你喜欢,向下 100 层都没问题。

变异

变异的 IncludeMany,即使选择的不是导航属性,也可以贪婪加载。

Select<Tag>().IncludeMany(a => a.TestManys.Where(b => b.TagId == a.Id));

支持联合键关系指定

比如 EFCore include 吧,如何只查询每项子集合的前几条数据,它只可以加载所有导致IO性能低下(如果某些子集合,有100条,200条),FreeSql 可以解决这个问题。

Select<Tag>().IncludeMany(a => a.TestManys.Take(10));

原文地址:https://www.cnblogs.com/FreeSql/p/11531404.html

时间: 2024-10-03 14:45:31

FreeSql (二十六)贪婪加载 Include、IncludeMany、Dto、ToList的相关文章

Oracle Coherence中文教程二十:预加载缓存

预加载缓存 本章介绍了不同的模式,你可以用它来预加载缓存.该模式包括批量装载和分布载荷. 本章包含以下各节: 执行批量加载和处理 执行分布式批量加载 20.1执行批量加载和处理 例20-5, PagedQuery.java ,演示了在一个连贯缓存技术,有效地批量加载和处理项目. 20.1.1批量写入缓存 使用连贯性时,一个常见的场景是预先填充缓存应用程序使用它之前.一个简单的方法来做到这例20-1中的Java代码所示: 例20-1预加载缓存 public static void bulkLoad

spring学习 十六 spring加载属性文件

第一步:创建一个properties文件,以数据库链接作为实例 db.properties jdbc.url=jdbc:mysql://192.168.153.128:3306/mybaties?characterEncoding=utf-8 jdbc.driver=com.mysql.jdbc.Driver jdbc.username=com.mysql.jdbc.Driver jdbc.password=123456 第二步在spring配置文件加入context的约束,并使用<contex

(二十六)类加载机制和类的加载、连接(验证、准备、解析)和初始化

一.概念 在代码编译后,就会生成JVM(Java虚拟机)能够识别的二进制字节流文件(*.class).而JVM把Class文件中的类描述数据从文件加载到内存,并对数据进行校验.转换解析.初始化,使这些数据最终成为可以被JVM直接使用的Java类型,这个说来简单但实际复杂的过程叫做JVM的类加载机制. Class文件中的"类"从加载到JVM内存中,到卸载出内存过程有七个生命周期阶段.类加载机制包括了前五个阶段. 如下图所示: 其中,加载.验证.准备.初始化.卸载的开始顺序是确定的,注意,

include延时加载和贪婪加载

贪婪加载:顾名思议就是把所有要加载的东西一 次性读取 using (var  context = new MyDbContext()) {     var orders {     var orders = from o in context.Orders.Include("OrderDetails") select o; } 当读取订单信息orders的时候,我们希望把订单的详细信息也读取出来,那么这里我们使用Include关键字将关联表也加载进 来. 延迟加载:即当我们需要用到的时

Bootstrap &lt;基础二十六&gt;进度条

Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet Explorer 9 及之前的版本和旧版的 Firefox 不支持该特性,Opera 12 不支持动画. 默认的进度条 创建一个基本的进度条的步骤如下: 添加一个带有 class .progress 的 <div>. 接着,在上面的 <div> 内,添加一个带有 class .prog

马哥学习笔记二十六——MySQL主从复制

配置MySQL复制基本步骤: 一.master 1.启用二进制日志 log-bin = master-bin log-bin-index = master-bin.index 2.选择一个惟一server-id server-id = {0-2^32} 3.创建具有复制权限的用户 REPLICATION SLAVE REPLICATION CLIENT 二.slave 1.启用中继日志 relay-log = relay-log relay-log-index = 2.选择一个惟一的server

Android4.0图库Gallery2代码分析(二) 数据管理和数据加载

Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 2012-09-07 11:19 8152人阅读 评论(12) 收藏 举报 代码分析android相册优化工作 Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 一 图库数据管理 Gallery2的数据管理 DataManager(职责:管理数据源)- MediaSource(职责:管理数据集) - MediaSet(职责:管理数据项).DataManager中初始化所有的数据源(LocalSo

26、蛤蟆的数据结构笔记之二十六串应用之建立词索引表

26.蛤蟆的数据结构笔记之二十六串应用之建立词索引表 本篇名言:"生命是一条美丽而曲折的幽径,路旁有妍花的丽蝶,累累的美果,但我们很少去停留观赏,或咀嚼它,只一心一意地渴望赶到我们幻想中更加美丽的豁然开朗的大道.然而在前进的程途中,却逐渐树影凄凉,花蝶匿迹,果实无存,最后终于发觉到达一个荒 漠.-- 萨拉" 1.  信息检索 信息检索是计算机应用的重要领域之一.为了提高图书馆数目检索的效率,建立书名关键词索引,可以实现读者快速检索书目的自动化,即读者根据关键词索引表,读者可以方便查询到

EntityFramework(EF)贪婪加载和延迟加载的选择和使用

贪婪加载:顾名思议就是把所有要加载的东西一 次性读取 1 using (var context = new MyDbContext()) 2 { 3 var orders = from o in context.Orders.Include("OrderDetails") select o; 4 } 当读取订单信息orders的时候,我们希望把订单的详细信息也读取出来,那么这里我们使用Include关键字将关联表也加载进 来. 延迟加载:即当我们需要用到的时候才进行加载(读取) 当我们