Web开发:ORM框架之使用Freesql的DbFrist封装常见功能
一、调用
public class Program
{static string connectionstring = "连接字符串(数据库名)";static void Main(string[] args){//1.连接数据库var freesql = new FreeSqlBuilder().UseConnectionString(DataType.SqlServer, connectionstring)//连接数据库//.UseMonitorCommand(cmd => Console.Write(cmd.CommandText))//打印SQL.Build();//2.数据库=>C#实体List<string> tablenames = new List<string> { {"数据表1"} , {"数据表2"} };string entitystring = GetEntitystring(freesql,tablenames);Console.WriteLine(entitystring);}}
二、封装
public class CsProperty
{public string Name { get; set; }//字段名称public string DefaultValue { get; set; }//默认值,例如"123"(string带双引号的),123(int decimal bool不带引号的)public string CsType { get; set; }//cs类型,形如int?public string Comment { get; set; }//注释public string Property { get; set; }//属性模板,形如public int Id { get; set; }}
public static class Logical
{// 表字段注释(只支持单表)public static string GetTableComment(IFreeSql fsql, string tablename, string filed){var tableinfo = fsql.DbFirst.GetTableByName(tablename);var tablelist = ChangeCsType(tableinfo.Columns.ToList());var tablecomment = tableinfo.Comment;StringBuilder sb = new StringBuilder();sb.Append($"【表({tablename})】注释:{tablecomment}\n");sb.Append($"【字段】注释:\n");foreach (var item in tablelist){sb.Append($"【{item.Name}({item.CsType})】{item.Comment}\n");}string CommonSQL = $@"--添加表注释
EXEC sys.sp_addextendedproperty
@name = N'MS_Description',
@value = N'你的注释语',
@level0type = N'SCHEMA', @level0name = N'dbo',
@level1type = N'TABLE', @level1name = N'{tablename}',
@level2type = N'COLUMN', @level2name = N'{filed}';
--修改表注释
EXEC sys.sp_updateextendedproperty
@name = N'MS_Description',
@value = N'新的注释语',
@level0type = N'SCHEMA', @level0name = N'dbo',
@level1type = N'TABLE', @level1name = N'{tablename}',
@level2type = N'COLUMN', @level2name = N'{filed}';";sb.Append($"\n\n{CommonSQL}");return sb.ToString();}//生成实体类的方法public static string GetEntityGrammar(IFreeSql freesql, List<string> tablenames){string output = "";foreach (var tablename in tablenames){string result = $"[Table(\"{tablename}\")]\npublic class {tablename} : AuditedAggregateRoot<int> \n{{\n";var tableInfo = freesql.DbFirst.GetTableByName(tablename);foreach (var item in tableInfo.Columns.OrderBy(x => x.Position)){var cstype = item.CsType.Name.ToLower();//获取类型if (cstype.StartsWith("int")){cstype = "int";}else if (cstype.Equals("datetime")){cstype = "DateTime";}else if (cstype.Equals("boolean")){cstype = "bool";}//获取是否可为空if (!cstype.Equals("string") && item.IsNullable){cstype += "?";}//获取注释,套入属性模板string feild = "";if (!string.IsNullOrEmpty(item.Comment)){feild += $" /// <summary>\n /// {item.Comment}\n /// </summary>\n";}feild += $" public {cstype} {item.Name} {{ get; set; }}\n";result += feild;}result += "}";output += result + "\n";}return output;}//生成创建实体的方法public static string GetBuildEntity(IFreeSql freesql, List<string> tablenames){if (tablenames.Count == 0){return null;}string output = "";StringBuilder sb_en = new StringBuilder();StringBuilder sb_lt = new StringBuilder();foreach (var tablename in tablenames){var tableInfo = freesql.DbFirst.GetTableByName(tablename);var tablelist = ChangeCsType(tableInfo.Columns.ToList());sb_en.Append($"var {tablename.ToLower()} = new {tablename}\n{{\n");sb_lt.Append($"List<{tablename}> destictlist = new List<{tablename}>();\n");sb_lt.Append($"foreach (var item in sourcelist)\n{{\n");sb_lt.Append($"\tvar entity = new {tablename}();\n");int index = 0;foreach (var item in tablelist){bool isLast = index == tablelist.Count - 1;if (isLast){sb_en.Append($"\t{item.Name} = {item.DefaultValue}\n");}else{sb_en.Append($"\t{item.Name} = {item.DefaultValue},\n");}sb_lt.Append($"\tentity.{item.Name} = item.{item.Name};\n");index++;}sb_en.Append($"}};\n");sb_lt.Append($"\tdestictlist.Add(entity);\n}}");}output = sb_en.ToString() + "\n\n" + sb_lt.ToString();return output;}//生成实体字段分类的方法public static string GetEntityFeildsClassify(IFreeSql freesql, List<string> tablenames){string output = "";foreach (var tablename in tablenames){var tableColumns = freesql.DbFirst.GetTableByName(tablename)?.Columns.OrderBy(x => x.Position);//item.CsType.Name.ToLower();var grouplist = tableColumns?.GroupBy(x => x.CsType.Name.ToLower()).Select(list => (Key: list.Key.ToString(), List: list.Select(x => x.Name)));output += $"【{tablename}全部字段】\n";output += $"{string.Join("\n", tableColumns.Select(x => x.Name))}\n";foreach (var item in grouplist){output += $"【{item.Key}】\n";output += $"{string.Join("\n", item.List)}\n";}output += "\n";}return output;}//根据表名获取表的详细信息public static string GetTableDetails(IFreeSql freesql, List<string> tablenames){StringBuilder result = new StringBuilder();foreach (var tablename in tablenames){var detail = freesql.DbFirst.GetTableByName(tablename);result.Append($"表名称:{detail.Name}\n");result.Append($"表注释:{(string.IsNullOrEmpty(detail?.Comment) ? "无表注释" : detail?.Comment)}\n");result.Append($"表主键:{detail?.Primarys.FirstOrDefault()?.Name ?? "无表主键"}\n");result.Append($"表的自增列:{detail?.Identitys.FirstOrDefault()?.Name ?? "无自增列"}\n");result.Append($"表的字段数:{detail.Columns.Count}\n");result.Append($"表的索引数:{detail.Indexes.Count}\n");int index = 0;foreach (var item in detail.Indexes){index++;result.Append($"索引编号{index}:");string indexcontent = "";foreach (var jtem in item.Columns){indexcontent += jtem?.Column?.Name + ",";}result.Append($"{indexcontent.Trim(',')}\n");}result.Append("\n");}return result.ToString();}//随机插入数据public static string InsertRandomData(IFreeSql freesql, List<string> tablenamelist, int count){foreach (var tablename in tablenamelist){// 获取表的结构信息var tableInfo = freesql.DbFirst.GetTableByName(tablename);// 构建字段名和占位符var fieldNames = string.Join(",", tableInfo.Columns.Where(x => !x.IsIdentity).OrderBy(x => x.Position).Select(c => c.Name));var valuesBuilder = new StringBuilder();// 随机数生成器Random random = new Random();// 执行插入for (int i = 0; i < count; i++){StringBuilder valueBuilder = new StringBuilder();foreach (var item in tableInfo.Columns.Where(x => !x.IsIdentity).OrderBy(x => x.Position)){var cstype = item.CsType.Name.ToLower();object defaultValue = null;if (cstype.Equals("string")){defaultValue = item.MaxLength <= 20 ? $"数据{i}" : $"模拟测试数据{i}";}else if (cstype.StartsWith("int") || cstype.StartsWith("decimal")){defaultValue = random.Next(0, 1000); // 随机整数}else if (cstype.Equals("datetime")){defaultValue = DateTime.Now.AddDays(random.Next(-30, 0)); // 随机日期}else if (cstype.Equals("boolean")){defaultValue = random.Next(0, 2) == 1; // 随机布尔值}else{defaultValue = DBNull.Value; // 未处理的其他类型}// 处理值为 null 或 DBNull 的情况if (defaultValue == null || defaultValue == DBNull.Value){valueBuilder.Append("NULL,");}else if (cstype.Equals("string")){valueBuilder.Append($"'{defaultValue}',");}else if (cstype.Equals("datetime")){valueBuilder.Append($"'{((DateTime)defaultValue):yyyy-MM-dd HH:mm:ss}',");}else{valueBuilder.Append($"{defaultValue},");}}// 去掉最后一个逗号valueBuilder.Length--;// 构建完整的 SQL 插入语句string insertSql = $"INSERT INTO {tablename} ({fieldNames}) VALUES ({valueBuilder})";// 执行插入操作var effectcount = freesql.Ado.ExecuteNonQuery(insertSql);}}return $"执行插入到表【{string.Join(",", tablenamelist)}】成功!各自插入了【{count}】条数据!";}//返回多个表的共有字段public static string GetTablesPublicFeilds(IFreeSql freesql, List<string> tablenamelist){if (tablenamelist.Count == 0 || tablenamelist.Count == 1){return null;}List<string> last = new List<string>();List<DbColumnInfo> storage = new List<DbColumnInfo>();List<DbColumnInfo> dbinfo = new List<DbColumnInfo>();foreach (var item in tablenamelist){dbinfo = freesql.DbFirst.GetTableByName(item).Columns.ToList();var tablefeilds = dbinfo.Select(x => x.Name).ToList();last = last.Count == 0 ? tablefeilds : tablefeilds.Intersect(last).ToList();}storage = dbinfo.Where(x => last.Contains(x.Name)).ToList();var counts = "总数是:" + storage.Count + "\n";var allfeilds = string.Join("\n", last);var changeinfo = ChangeCsType(storage);var showfeilds = string.Join("\n", changeinfo.Select(x => x.Property).ToList());return counts + allfeilds + "\n\n" + showfeilds;}//返回多个表的全部字段(去重复)public static string GetTablesAllFeilds(IFreeSql freesql, List<string> tablenamelist){if (tablenamelist.Count == 0 || tablenamelist.Count == 1){return null;}List<string> last = new List<string>();List<DbColumnInfo> storage = new List<DbColumnInfo>();List<DbColumnInfo> dbinfo = new List<DbColumnInfo>();foreach (var item in tablenamelist){dbinfo = freesql.DbFirst.GetTableByName(item).Columns.ToList();var tablefeilds = dbinfo.Select(x => x.Name).ToList();last.AddRange(tablefeilds);storage.AddRange(dbinfo);}last = last.Distinct().ToList();storage = storage.Distinct().ToList();storage = storage.Where(x => last.Contains(x.Name)).ToList();var counts = "总数是:" + last.Count + "\n";var allfeilds = string.Join("\n", last);var changeinfo = ChangeCsType(storage);var showfeilds = string.Join("\n", changeinfo.Select(x => x.Property).Distinct().ToList());return counts + allfeilds + "\n\n" + showfeilds;}//返回两表的独有字段public static string GetTwoTablesUniqueFeilds(IFreeSql freesql, List<string> tablenamelist){if (tablenamelist.Count != 2){return $"您输入了{tablenamelist.Count}个表,该功能只支持两表查询!";}var aname = tablenamelist[0];var bname = tablenamelist[1];var alist = freesql.DbFirst.GetTableByName(aname).Columns;var blist = freesql.DbFirst.GetTableByName(bname).Columns;var a_feilds = alist.Select(x => x.Name);var b_feilds = blist.Select(x => x.Name);var a_unique_feilds = a_feilds.Except(b_feilds);var b_unique_feilds = b_feilds.Except(a_feilds);var a_unique_cols = alist.Where(x => a_unique_feilds.Contains(x.Name)).ToList();var b_unique_cols = blist.Where(x => b_unique_feilds.Contains(x.Name)).ToList();var aUniqueList = ChangeCsType(a_unique_cols);var bUniqueList = ChangeCsType(b_unique_cols);StringBuilder result = new StringBuilder();StringBuilder result2 = new StringBuilder();result.Append($"{aname}的独有字段是:\n");result2.Append($"{aname}的独有字段是:\n");foreach (var item in aUniqueList){result.Append($"{item.Name}({item.CsType})\n");result2.Append(item.Property + "\n");}result.Append($"\n{bname}的独有字段是:\n");result2.Append($"\n{bname}的独有字段是:\n");foreach (var item in bUniqueList){result.Append($"{item.Name}({item.CsType})\n");result2.Append(item.Property + "\n");}string output = result.ToString() + "\n" + result2.ToString();return output;}//将列转化为Cs类型表达式public static List<CsProperty> ChangeCsType(List<DbColumnInfo> list){List<CsProperty> result = new List<CsProperty>();foreach (var item in list.OrderBy(x => x.Position)){CsProperty en = new CsProperty();en.Name = item.Name;en.Comment = item.Comment;en.DefaultValue = item.DefaultValue;var cstype = item.CsType.Name.ToString().ToLower();var random = new Random();var rnum = random.Next(0, 9999);if (cstype.Equals("string")){en.DefaultValue = item.MaxLength <= 10 ? $"\"默认值\"" : $"\"默认值数据{rnum}\"";en.CsType = "string";}else if (cstype.StartsWith("int")){en.DefaultValue = rnum.ToString();en.CsType = "int" + $"{(item.IsNullable ? "?" : "")}";}else if (cstype.StartsWith("decimal")){en.DefaultValue = rnum.ToString();en.CsType = "decimal" + $"{(item.IsNullable ? "?" : "")}";}else if (cstype.Equals("datetime")){en.DefaultValue = "DateTime.Now"; // 今天日期en.CsType = "DateTime" + $"{(item.IsNullable ? "?" : "")}";}else if (cstype.Equals("boolean")){en.DefaultValue = (random.Next(0, 2) == 1).ToString(); // 随机布尔值en.CsType = "bool";}else{en.DefaultValue = "未知";en.CsType = item.CsType.Name.ToLower();}en.Property = $"public {en.CsType} {en.Name} {{ get; set; }}";result.Add(en);}return result;}
}
相关文章:
Web开发:ORM框架之使用Freesql的DbFrist封装常见功能
一、调用 public class Program {static string connectionstring "连接字符串(数据库名)";static void Main(string[] args){//1.连接数据库var freesql new FreeSqlBuilder().UseConnectionString(DataType.SqlServer, connectionstring…...
【多线程-第一天-多线程的执行原理-多线程的优缺点-主线程 Objective-C语言】
一、多线程的执行原理 1.单任务操作系统:同一时间只能执行一个任务 多任务操作系统:同一时间可以执行多个任务 比如,我可以一边听着酷狗,一边聊着QQ, 在单任务的操作系统里边,只有进程,没有线程, 单任务操作系统,CPU必须执行完一个任务,才能执行第二个任务, 多任…...
SQL基础语法介绍-基于MySQL
文章目录 一、SQL分类二、SQL语法1.数据库字段类型1.1.数值类型1.2 字符类型1.3 日期类型 2.字段约束2.1约束介绍2.2 非空约束(not null)2.3 唯一约束(unique)2.4 主键约束(primary key)2.5 自增长主键2.6 …...
一分钟学习数据安全——数据安全风险的系统化应对思路
数据是组织的重要资产,未经授权的数据访问可能导致数据泄露、数据篡改、隐私侵犯和合规风险等问题。企业可以通过数据访问控制来提高信息系统在数据全生命周期管理中的安全性。企业可以引入IAM系统,来控制身份来管理权限。通过对用户访问权限的管理和合适…...
端口port常识
端口(Port)用于区分不同的服务或进程。在网络通信中,每个运行在计算机上的进程都会通过一个端口来与其他计算机上的进程进行通信。以下是一些关于端口和使用常识的信息: 端口号范围: 0-1023:这些被称为“知…...
【Oracle实战】文章导读
【Oracle基础】 【实战】Oracle基础之单机安装-01 Windows 2016 Oracle 11gR2【实战】Oracle基础之单机安装-02 Windows 2016 Oracle 12cR2【实战】Oracle基础之单机安装-03 CentOS 7.9 Oracle 11gR2【实战】Oracle基础之单机安装&#x…...
“人工智能+高职”:VR虚拟仿真实训室的发展前景
在当今科技日新月异的时代,人工智能(AI)与虚拟现实(VR)技术的融合正逐步改变着各行各业,教育领域也不例外。特别是在高等职业教育(简称“高职”)体系中,VR虚拟仿真实训室…...
c语言学习27宏定义条件编译
1类型重定义 typedef typedef关键字 属性:关键字 功能:将数据类型重新定义别名 (数据类型 别名) 格式:typedef数据类型名 别名; 例子:typedef unsigned char u8; 位置…...
理论结合实践:用Umami构建网站分析系统
个人博客地址(欢迎大家访问):理论结合实践:用Umami构建网站分析系统 1. 引言 网站统计分析是一种通过收集、处理和分析网站数据来评估网站性能、用户行为和流量来源的综合方法。通过分析用户访问模式、页面浏览量、访问时长、用户…...
Unreal从入门到精通之如何绘制用于VR的3DUI交互的手柄射线
文章目录 前言实现方式MenuLaser实现步骤1.Laser和Cursor2.移植函数3.启动逻辑4.检测射线和UI的碰撞5.激活手柄射线6.更新手柄射线位置7.隐藏手柄射线8.添加手柄的Trigger监听完整节点如下:效果图前言 之前我写过一篇文章《Unreal5从入门到精通之如何在VR中使用3DUI》,其中讲…...
移动充储机器人“小奥”的多场景应用(上)
在当前现代化城市交通体系中,移动充储机器人“小奥”发挥着至关重要的作用。该机器人不仅是一个简单的设备,而是一个集成了高科技的移动充电站,为新能源汽车提供了一种前所未有的便捷充电解决方案。该机器人配备了先进的电池管理系统…...
已解决wordpress提示正在执行例行维护,请一分钟后回来
今天打开网站时提示“正在执行例行维护,请一分钟后回来”,一分钟后还这样,刷新也没用,这究竟是怎么回事了? 问题原因 这是WordPress在更新,wordpress在升级程序、主题、插件时,都会先切换到维护模式&…...
DDR3脚位解析,class分类
SDQ{0-31}:数据信号,为输入/输出双向信号。 SA{0-15}:地址信号为输入信号。 SDQS{0-3}P/N:数据选通信号,数据可以通过DQS的上升沿与下降沿传输。在读模式时,DQS由存储器发给CPU,DQS与数据边沿对齐。在写模…...
【深度学习|目标跟踪】DeepSort 详解
DeepSort详解 1、Sort回顾2、DeepSort的状态向量3、DeepSort的外观特征4、DeepSort的track状态5、DeepSort的代价矩阵以及门控矩阵6、DeepSort的级联匹配 1、Sort回顾 查看这篇博客 2、DeepSort的状态向量 Sort中的卡尔曼滤波使用的目标的状态向量是一个7维的向量,…...
快速图像识别:落叶植物叶片分类
1.背景意义 研究背景与意义 随着全球生态环境的变化,植物的多样性及其在生态系统中的重要性日益受到关注。植物叶片的分类不仅是植物学研究的基础,也是生态监测、农业管理和生物多样性保护的重要环节。传统的植物分类方法依赖于人工观察和专家知识&…...
MTK Android12 user版本MtkLogger
目录 1.修改device/mediatek/system/common/device.mk 2.修改device/mediatek/system/common/mtklog/mtklog-config-bsp-eng.prop,修改为false是为了开机的时候不要自动启动 3.修改device/mediatek/vendor/common/device.mk 4.修改vendor/mediatek/proprietary/…...
Python数据结构day2
一、链表 1.1目的 解决顺序表存储数据有上限,并且插入和删除操作效率低的问题 1.2概念 链表:链式存储的线性表,使用随机物理内存存储逻辑上连续的数据 链表的组成:由一个个结点组成 结点:由数据域和链接域组成&a…...
后台通用tag面包屑
思路:要实现点击左侧菜单栏,页面跳转且显示面包屑(本文用的是TSVue3) 功能点: 最多显示5个标签超过5个时,自动移除最早的标签至少保留1个标签支持标签关闭功能 首先在store.ts 处理路由(点击过的路由,当前…...
oracle数据恢复—通过拼接数据库碎片的方式恢复Oracle数据的案例
Oracle数据库故障: 存储掉盘超过上限,lun无法识别。管理员重组存储的位图信息并导出lun,发现linux操作系统上部署的oracle数据库中有上百个数据文件的大小变为0kb。数据库的大小缩水了80%以上。 取出&并分析oracle数据库的控制文件。重组…...
node.js fluent-ffmpeg 桌面推流
1,安装fluent-ffmpeg,npm install fluent-ffmpeg 2,推流代码: //stream.js const ffmpeg require(fluent-ffmpeg); const rtmpUrl "rtmp://localhost:1935/live/desktop"; //ffmpeg -f gdigrab -i desktop -vcode…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
