Web开发:ORM框架之使用Freesql的分表分页写法
一、自动分表(高版本可用)
特性写法
//假如是按月分表:[Table(Name = "log_{yyyyMM}", AsTable = "createtime=2022-1-1(1 month)")]注意:①需包含log_202201这张表 ②递增规律是一个月一次,确保他们存在。 ③确保有字段createtime。[Table(Name = "Teacher_{yyyy}", AsTable = "time=2023-1-1(1 year)")]public class Teacher{[Column(IsPrimary = true)]public int id { get; set; }public DateTime time { get; set; }}

程序写法(附上生成的SQL):
static void Main(string[] args)
{//-----------------------01查全表---------------------------var list1 = freesql.Select<Teacher>().ToList();var sql = freesql.Select<Teacher>().ToSql();/*SELECT * from (SELECT a.[id], a.[time] FROM [Teacher_2024] a) ftbUNION ALLSELECT * from (SELECT a.[id], a.[time] FROM [Teacher_2023] a) ftb *///-----------------------02跨时间查表---------------------------//var start = new DateTime(2023, 12, 31);//var end = new DateTime(2024, 1, 2);var sql2 = freesql.Select<Teacher>().Where(x => x.time.Between(DateTime.Parse("2023-12-31"), DateTime.Parse("2024-01-02")))//时间写法1//.Where(x => x.time.Between(start,end))//时间写法2//.Where(x => x.time>=start && x.time<=end)//时间写法3.ToSql();var list2 = freesql.Select<Teacher>().Where(x => x.time.Between(DateTime.Parse("2023-12-31"), DateTime.Parse("2024-01-02"))).ToList();/*SELECT * from (SELECT a.[id], a.[time] FROM [Teacher_2024] a WHERE (a.[time] between '2023-12-31 00:00:00.000' and '2024-01-02 00:00:00.000')) ftbUNION ALLSELECT * from (SELECT a.[id], a.[time] FROM [Teacher_2023] a WHERE (a.[time] between '2023-12-31 00:00:00.000' and '2024-01-02 00:00:00.000')) ftb*///-----------------------03不跨时间查表---------------------------var list3 = freesql.Select<Teacher>().Where(x => x.time.Between(DateTime.Parse("2024-1-1"), DateTime.Parse("2024-01-02"))).ToList();var sql3 = freesql.Select<Teacher>().Where(x => x.time.Between(DateTime.Parse("2024-1-1"), DateTime.Parse("2024-01-02"))).ToSql();/*SELECT a.[id], a.[time] FROM [Teacher_2024] a WHERE (a.[time] between '2024-01-01 00:00:00.000' and '2024-01-02 00:00:00.000')*/
}
二、手动分表
1.静态映射类型(简单)
//01 配置分表表名 映射实体 查询框架
var tablenamelist = new List<string> { "Student_2023", "Student_2024" };
var unionSelect = fsql.Queryable<StudentAll>();
var querySelect1 = fsql.Queryable<StudentAll>();
var querySelect2 = fsql.Queryable<StudentAll>();//02 Union连接分表
foreach (var tableName in tablenamelist)
{bool isExistTable = fsql.DbFirst.GetTableByName(tableName) != null;if (isExistTable)//存在该表则union all{unionSelect.AsTable((type, oldname) => tableName);//不要在遍历循环内部这里用where筛选,因为遍历多少次,就会加上where多少次,sql效率低 }
}//03 编写sql条件
string cte = unionSelect.Where(x => x.Age.Equals(25))//这里不写cte,直接把where写到下面去也可以.ToSql();//所有分表都会加上这个条件//04 查表且映射到实体
var allList = querySelect1.WithSql(cte).ToList();//SELECT * FROM CTEvar pageList = querySelect2.WithSql(cte).Page(1, 20).Count(out var counts).ToList();//SELECT TOP 20 * FROM CTE
cte处生成的sql是(下同):
SELECT * FROM Student_2023 WHERE Age = 25
UNION ALL
SELECT * FROM Student_2024 WHERE Age = 25
注意:三个select不能合并,否则会导致重复查询!(下同)
- unionSelect 用于构建跨表的联合查询,并且没有执行查询。
- querySelect1 用于获取符合条件的全部数据。
- querySelect2 用于分页查询并获取指定页面的数据。
2.动态映射类型
要注意,先筛查,后联表,因此需要加上where语句,小表union小表才更快!(而不是联合成大表后再筛选)
//01 配置分表表名 映射实体 查询框架
var tablenamelist = new List<string> { "Student_2023", "Student_2024" };
var entity = typeof(StudentAll);
var unionSelect = fsql.Queryable<object>();
var querySelect1 = fsql.Queryable<object>();
var querySelect2 = fsql.Queryable<object>();//02 Union连接分表
foreach (var tableName in tablenamelist)
{bool isExistTable = fsql.DbFirst.GetTableByName(tableName) != null;if (isExistTable)//存在该表则union all{unionSelect.AsType(entity).AsTable((type, oldname) => tableName);//不要在遍历循环内部这里用where筛选,因为遍历多少次,就会加上where多少次,sql效率低 }
}//03 编写sql条件
string cte = unionSelect.Where(x => (x as StudentAll).Age.Equals(25))//注意:此处的StudentAll必须是映射实体或其父类.ToSql();//所有分表都会加上这个条件//04 查表且映射到实体
var allList = querySelect1.AsType(entity).WithSql(cte).ToList().OfType<StudentAll>().ToList();//SELECT * FROM CTEvar pageList = querySelect2.AsType(entity).WithSql(cte).Page(1, 20).Count(out var counts).ToList().OfType<StudentAll>().ToList();//SELECT TOP 20 * FROM CTE
注意:以下两种写法输出结果是一致的
List<object> data1 = freesql.Select<object>().AsType(type).WithSql(sql).ToList();
ISelect<object> data2 = freesql.Select<object>().WithSql(sql);List<Student> result1 = data1.OfType<Student>().ToList();//两者输出是一致的
List<Student> result2 = data2.ToList<Student>();//两者输出是一致的
相关文章:
Web开发:ORM框架之使用Freesql的分表分页写法
一、自动分表(高版本可用) 特性写法 //假如是按月分表:[Table(Name "log_{yyyyMM}", AsTable "createtime2022-1-1(1 month)")]注意:①需包含log_202201这张表 ②递增规律是一个月一次,确保他们…...
Unity功能模块一对话系统(1)前置准备
也许你也曾被游戏中的对话系统深深吸引,那些精心设计的对白、鲜活的角色配音、甚至是简单的文字对话,往往能让玩家产生强烈的代入感和情感共鸣。如果你正在开发一款游戏,或者计划为你的项目加入一个引人入胜的对话系统,那么 Unity…...
strrchr的概念和使用案例
strrchr 是 C 语言标准库中的一个函数,用于在字符串中查找最后一次出现的字符,并返回指向该字符的指针。 概念: strrchr 函数在给定的字符串中从末尾开始搜索指定的字符,返回一个指向该字符最后一次出现的指针。如果字符在字符串…...
缓存管理自动化:JuiceFS 企业版 Cache Group Operator 新特性发布
近期,JuiceFS 企业版推出了 Cache Group Operator,用于自动化创建和管理缓存组集群。Operator 是一种简化 Kubernetes 应用管理的工具,它能够自动化应用程序的生命周期管理任务,使部署、扩展和运维更加高效。 在推出 Operator 之前…...
C++ 并发专题 - 实现一个线程安全的队列
一:概述 本文利用 C 标准库中的多线程、条件变量、互斥锁等工具来实现一个线程安全的队列,并且使用多个线程来向队列中添加和获取数据。 二:实现过程: #include <iostream> #include <queue> #include <mutex&g…...
SQL 基础教程
SQL 是用于访问和处理数据库的标准的计算机语言。 在本教程中,您将学到如何使用 SQL 访问和处理数据系统中的数据,这类数据库包括:Oracle, Sybase, SQL Server, DB2, Access 等等。 SQL 是用于访问和处理数据库的标准的计算机语言。 什么是…...
【源码】Sharding-JDBC源码分析之SQL中影子库ShadowSQLRouter路由的原理
Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 3、Sharding-JDBC分库分表之SpringBoot主从配置 4、SpringBoot集成Sharding-JDBC-5.3.0分库分表 5、SpringBoot集成Sharding-JDBC-5.3.0实现按月动态建表分表 6、【…...
雷池 WAF 搭配阿里云 CDN 使用教程
雷池 WAF(Web Application Firewall)是一款强大的网络安全防护产品,通过实时流量分析和精准规则拦截,有效抵御各种网络攻击。在部署雷池 WAF 的同时,结合阿里云 CDN(内容分发网络)可以显著提升网…...
3.银河麒麟V10 离线安装Nginx
1. 下载nginx离线安装包 前往官网下载离线压缩包 2. 下载3个依赖 openssl依赖,前往 官网下载 pcre2依赖下载,前往Git下载 zlib依赖下载,前往Git下载 下载完成后完整的包如下: 如果网速下载不到请使用网盘下载 通过网盘分享的文件…...
【模块一】kubernetes容器编排进阶实战之kubernetes 资源限制
kubernetes 资源限制 kubernetes中资源限制概括 1.如果运行的容器没有定义资源(memory、CPU)等限制,但是在namespace定义了LimitRange限制,那么该容器会继承LimitRange中的 默认限制。 2.如果namespace没有定义LimitRange限制,那么该容器可…...
【开源】一款基于SpringBoot的智慧小区物业管理系统
一、下载项目文件 项目文件源码链接:https://pan.quark.cn/s/3998d958e182如出现网盘空间不够存的情况!!!解决办法是先用夸克手机app注册,然后保存上方链接,就可以得到1TB空间了!!&…...
Goland:专为Go语言设计的高效IDE
本文还有配套的精品资源,点击获取 简介:Goland是JetBrains公司开发的集成开发环境(IDE),专为Go语言设计,提供了高效的代码编辑、强大的调试工具和丰富的项目管理功能。其智能代码补全、强大的调试与测试支…...
云手机与Temu矩阵:跨境电商运营新引擎
云手机与 Temu 矩阵结合的基础 云手机技术原理 云手机基于先进的 ARM 虚拟化技术,在服务器端运行 APP。通过在服务器上利用容器虚拟化软件技术,能够虚拟出多个独立的手机操作系统实例,每个实例等同于一部单独的手机,可独立运行各…...
仓颉编程笔记1:变量函数定义,常用关键字,实际编写示例
本文就在网页版上体验一下仓颉编程,就先不下载它的SDK了 基本围绕着实际摸索的编程规则来写的 也没心思多看它的文档,写的不太明确,至少我是看的一知半解的 文章提供测试代码讲解、测试效果图: 目录 仓颉编程在线体验网址&…...
Python小括号( )、中括号[ ]和大括号{}代表什么
python语言最常见的括号有三种,分别是:小括号( )、中括号[ ]和大括号也叫做花括号{ },分别用来代表不同的python基本内置数据类型。 小括号():struct结构体,但不能改值 python中的小括号( )&am…...
React里使用lodash工具库
安装 使用命令 npm install lodash 页面引入 常见的引入方式 引入整个lodash对象: import _ from lodash按名称引入特定的函数: import { orderBy } from "lodash"; tips: 这两种引入方式都会引入整个lodash库, 体积大&#x…...
【免费分享】mysql笔记,涵盖查询、缓存、存储过程、索引,优化。
概括 本篇笔记涵盖基础查询、视图、存储过程、函数、索引、优化、分库分表。适合在学完mysql后进行时常观看。下面展示部分内容。如果需要可以在文章底部的链接进行下载查看。 简介 数据库 数据库:DataBase,简称 DB,存储和管理数据的仓库…...
C语言-数据结构-图
目录 一,图的概念 1,图的定义 2,图的基本术语 二,图的存储结构 1,邻接矩阵 2,邻接表 三,图的遍历 1,深度优先搜索 2,广度优先搜素 四,生成树和最小生成树 1,生成树的特点: 2,最小生成树 (1)普利姆算法Prim (2)普里姆算法思路 五,最短路径 1,Dijkstra算法 2,Fl…...
android sqlite 数据库简单封装示例(java)
sqlite 数据库简单封装示例,使用记事本数据库表进行示例。 首先继承SQLiteOpenHelper 使用sql语句进行创建一张表。 public class noteDBHelper extends SQLiteOpenHelper {public noteDBHelper(Context context, String name, SQLiteDatabase.CursorFactory fact…...
“宠物服务的跨平台整合”:多设备宠物服务平台的实现
2.1 SSM框架介绍 本课题程序开发使用到的框架技术,英文名称缩写是SSM,在JavaWeb开发中使用的流行框架有SSH、SSM、SpringMVC等,作为一个课题程序采用SSH框架也可以,SSM框架也可以,SpringMVC也可以。SSH框架是属于重量级…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...
