FreeSql (二十五)延时加载
FreeSql 支持导航属性延时加载,即当我们需要用到的时候才进行加载(读取),支持1对1、多对1、1对多、多对多关系的导航属性。
当我们希望浏览某条订单信息的时候,才显示其对应的订单详细记录时,我们希望使用延迟加载来实现,这样不仅加快的了 读取的效率,同时也避免加载不需要的数据。延迟加载通常用于foreach循环读取数据时。
那么我们在定义Model的时候,需要在属性前面添加virtual关键字。如下
public class Order {[Column(IsPrimary = true)]public int OrderID { get; set; }public string OrderTitle { get; set; }public string CustomerName { get; set; }public DateTime TransactionDate { get; set; }public virtual List<OrderDetail> OrderDetails { get; set; }
}
public class OrderDetail {[Column(IsPrimary = true)]public int DetailId { get; set; }public int OrderId { get; set; }public virtual Order Order { get; set; }
}
延时加载功能默认被关闭的,使用此功能请时,请在申明处开启;
延时加载功能,依赖 FreeSql.Extensions.LazyLoading 包,请前往 nuget 下载;
IFreeSql fsql = new FreeSql.FreeSqlBuilder().UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10").UseLazyLoading(true) //开启延时加载功能.UseMonitorCommand(cmd => Console.WriteLine(cmd.CommandText)) //监听SQL命令对象,在执行前.Build();var order = fsql.Select<Order>().Where(a => a.OrderID == 1).ToOne(); //查询订单表
var orderDetail1 = order.OrderDetails; //第一次访问,查询数据库
var orderDetail2 = order.OrderDetails; //第二次访问,不查
var order1 = orderDetail1.FirstOrDefault(); //访问导航属性,此时不查数据库,因为 OrderDetails 查询出来的时候已填充了该属性
控制台输出内容:
SELECT a.`OrderID`, a.`OrderTitle`, a.`CustomerName`, a.`TransactionDate`
FROM `Order` a
WHERE (a.`OrderID` = 1)
limit 0,1SELECT a.`DetailId`, a.`OrderId`
FROM `OrderDetail` a
WHERE (a.`OrderId` = 1)
FreeSql延时加载支持1对1、多对1、1对多、多对多关系的导航属性,前三者大小同异,以下我们单独介绍多对多关系。
多对多延时加载
public partial class Song {[Column(IsIdentity = true)]public int Id { get; set; }public DateTime? Create_time { get; set; }public bool? Is_deleted { get; set; }public string Title { get; set; }public string Url { get; set; }public virtual ICollection<Tag> Tags { get; set; }
}
public partial class Song_tag {public int Song_id { get; set; }public virtual Song Song { get; set; }public int Tag_id { get; set; }public virtual Tag Tag { get; set; }
}
public partial class Tag {[Column(IsIdentity = true)]public int Id { get; set; }public int? Parent_id { get; set; }public virtual Tag Parent { get; set; }public decimal? Ddd { get; set; }public string Name { get; set; }public virtual ICollection<Song> Songs { get; set; }
}
如上有三个表,音乐、标签,以及他们的关系表。
var songs = fsql.Select<Song>().Limit(10).ToList(); //取10条音乐
var songs1 = songs.First().Tags; //第一次访问,查询数据库
var songs2 = Songs.First().Tags; //第二次访问,不查
控制台输出内容:
SELECT a.`Id`, a.`Create_time`, a.`Is_deleted`, a.`Title`, a.`Url`
FROM `Song` a
limit 0,10SELECT a.`Id`, a.`Parent_id`, a.`Ddd`, a.`Name`
FROM `Tag` a
WHERE (exists(SELECT 1
FROM `Song_tag` b
WHERE (b.`Song_id` = 2 AND b.`Tag_id` = a.`Id`)
limit 0,1))
总结
优点:只在需要的时候加载数据,不需要预先计划,避免了各种复杂的外连接、索引、视图操作带来的低效率问题。
缺陷:多次与DB交互,性能降低。
如果要在循环中使用数据,请使用贪婪加载,否则使用懒加载。
系列文章导航
(一)入门
(二)自动迁移实体
(三)实体特性
(四)实体特性 Fluent Api
(五)插入数据
(六)批量插入数据
(七)插入数据时忽略列
(八)插入数据时指定列
(九)删除数据
(十)更新数据
(十一)更新数据 Where
(十二)更新数据时指定列
(十三)更新数据时忽略列
(十四)批量更新数据
(十五)查询数据
(十六)分页查询
(十七)联表查询
(十八)导航属性
(十九)多表查询
(二十)多表查询 WhereCascade
(二十一)查询返回数据
(二十二)Dto 映射查询
(二十三)分组、聚合
(二十四)Linq To Sql 语法使用介绍
(二十五)延时加载
(二十六)贪婪加载 Include、IncludeMany、Dto、ToList
(二十七)将已写好的 SQL 语句,与实体类映射进行二次查询
(二十八)事务
(二十九)Lambda 表达式
(三十)读写分离
(三十一)分区分表
(三十二)Aop
(三十三)CodeFirst 类型映射
(三十四)CodeFirst 迁移说明
(三十五)CodeFirst 自定义特性
转载于:https://www.cnblogs.com/FreeSql/p/11531395.html
FreeSql (二十五)延时加载相关推荐
- WebGL简易教程(十五):加载gltf模型
文章目录 1. 概述 2. 实例 2.1. 数据 2.2. 程序 2.2.1. 文件读取 2.2.2. glTF格式解析 2.2.2.1. 场景节点 2.2.2.2. 网格 2.2.2.3. 缓冲,缓 ...
- cocos2d-x游戏开发(十五)游戏加载动画loading界面
个人原创,欢迎转载:http://blog.csdn.net/dawn_moon/article/details/11478885 这个资源加载的loading界面demo是在玩客网做逆转三国的时候随 ...
- OpenGL 图形库的使用(二十五)—— 高级OpenGL之帧缓冲Framebuffers
https://www.jianshu.com/p/d7066d6a02cc OpenGL 图形库的使用(二十五)-- 高级OpenGL之帧缓冲Framebuffers 刀客传奇 关注 0.2 20 ...
- Android进阶知识(二十五):Bitmap简介及其高效加载
Android进阶知识(二十五):Bitmap简介及其高效加载 一.Bitmap Bitmap代表一个位图,在Android中指的是一张图片,可以是png.jpg等格式的图片.BitmapDraw ...
- OpenGL教程翻译 第二十二课 使用Assimp加载模型
第二十二课 使用Assimp加载模型 原文地址:http://ogldev.atspace.co.uk/(源码请从原文主页下载) 背景 到现在为止我们都在使用手动生成的模型.正如你所想的,指明每个顶点 ...
- FreeSql (十五)查询数据
FreeSql在查询数据下足了功能,链式查询语法.多表查询.表达式函数支持得非常到位. IFreeSql fsql = new FreeSql.FreeSqlBuilder().UseConnecti ...
- 未处理异常和C++异常——Windows核心编程学习手札之二十五
未处理异常和C++异常 --Windows核心编程学习手札之二十五 当一个异常过滤器返回EXCEPTION_CONTINUE_SEARCH标识符时是告诉系统继续上溯调用树,寻找另外的异常过滤器,但当每 ...
- PyTorch框架学习十九——模型加载与保存
PyTorch框架学习十九--模型加载与保存 一.序列化与反序列化 二.PyTorch中的序列化与反序列化 1.torch.save 2.torch.load 三.模型的保存 1.方法一:保存整个Mo ...
- osgEarth的Rex引擎原理分析(二十五)地形瓦片大小尺寸和LOD的关系
目标:(十八)中的问题55 osgEarth::TerrainOption中_tileSize默认大小为17,LOD的默认范围为0-23,这两个值的关系是什么? 还有瓦片的像素尺寸_tilePixel ...
最新文章
- 校园交易平台后台系统git操作全过程
- 小孔子文章管理系统V2.0发布测试
- hfss和matlab,hfss和MATLAB联合仿真
- scala中map添加值_如何在Scala Map中反转键和值
- call,apply,bind的区别
- 领航服务器系统,应用领航:盘点那些年我们一起追过的OS
- 驾校学员驾考成绩管理系统
- flask (三) 重定向
- 如何:使用 DataAnnotations 特性验证模型数据+MetadataType的使用,MVC的Model层数据验证 指定要与数据模型类关联的元数据类
- Acme CAD Converter 8.9.8.1480 汉化破解版本
- Yum命令和配置文件分析
- 为什么加泪滴,Allegro如何加泪滴?
- C++学习(二零三)Quaro Geforce Tesla
- html表格中文字上下左右居中对齐,word表格中文字如何设置左右和上下居中(水平和垂直居中)...
- 分享一下 各类学习网站
- 淘宝大数据解析之timetunnel
- SlickEdit生成.a或.so后缀的makefile文件
- matlab吃cpu还是显卡_在GPU上运行MATLAB程序
- 骚操作!用Python自动下载抖音小姐姐
- HTC One V T320e如何从第三方ROM刷回官方RUU详细教程
热门文章
- 【Python CheckiO 题解】Time Converter (12h to 24h)
- REVERSE-PRACTICE-BUUCTF-4
- 【HDU - 1026 】Ignatius and the Princess I (bfs + 记录路径)
- 【qduoj - 1012】反转数字(模拟,水题)
- 百度顶会论文复现(2):GAN综述
- oracle中创建实体,生成实体-SqlSugar 4.x-文档园
- java null转换jason_常见java问题及解决办法汇总(干货可收藏)
- 腾讯云COS对象存储图片文件API的详细步骤过程
- 基于element-ui,vue的html随机点名器
- 在控制台输出九九乘法表