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…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
