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…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...

AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...

CSS3相关知识点
CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...