您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页Web开发:ORM框架之使用Freesql的DbFrist封装常见功能

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}  \n{{\n";
                var tableInfo = freesql.DbFirst.GetTableByName(tablename);
                var CSList = ChangeCsType(tableInfo.Columns.OrderBy(x => x.Position).ToList());
                foreach (var item in CSList)
                {
                    string feild = "";
                    if (item.Name.ToLower().Equals("id"))
                    {
                        feild += "\t[FreeSql.DataAnnotations.Column(IsPrimary =true, IsIdentity = true)]\n";
                    }
                    else
                    {
                        feild += $"\t[Column(\"{item.Name}\")]\n";
                    }
                    if (!string.IsNullOrWhiteSpace(item.Comment))
                    {
                        feild += $"\t[Description(\"{item.Comment}\")]\n";
                    }
                    feild += $"\t{item.Property}\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)
                {
                    item.Name = GetFormatName(item.Name);
                    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;
        }

        //转化词(首字母大写)
        public static List<string> KeyWordsUpFirst = new List<string> { "code", "name", "value", "time", "state", "path", "point", "type", "mark", "user", "log", "status", "data", "flag", "pollutant", "url", "date", "speed", "direct", "rank", "order", "district", "town", "city", "key", "hour" };


        //转化词(全大写)
        public static List<string> KeyWordsAllUp = new List<string> { "aqi", "pm", "no", "so", "co", "tsi" };

        //最后替换字典(用key替代value)
        public static Dictionary<string, string> ReplaceDict = new Dictionary<string, string>()
        {
            {"Reason","ReaSOn" },{"Update","UpDate" },{"Normal","NOrmal"}
        };

        //下划线转大驼峰
        public static string ConvertToPascalCase(string input)
        {
            // 分割字符串
            string[] words = input.Split('_');

            // 将每个单词的首字母大写并连接
            for (int i = 0; i < words.Length; i++)
            {
                if (words[i].Length > 0)
                {
                    words[i] = char.ToUpper(words[i][0]) + words[i].Substring(1);
                }
            }

            // 返回连接后的结果
            return string.Join(string.Empty, words);
        }

        //首字母大写
        public static string CapitalizeFirstLetter(string str)
        {
            if (string.IsNullOrEmpty(str))
                return str; // 返回原始字符串,或可以返回空字符串

            return char.ToUpper(str[0]) + str.Substring(1);
        }

        /// <summary>
        /// 格式化字段
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public static string GetFormatName(string name)
        {
            string result = name;
            foreach (var item in KeyWordsUpFirst)
            {
                result = result.Replace(item, CapitalizeFirstLetter(item));
            }
            foreach (var item in KeyWordsAllUp)
            {
                result = result.Replace(item, item.ToUpper());
            }
            foreach (var item in ReplaceDict)
            {
                result = result.Replace(item.Value, item.Key);
            }
            result = ConvertToPascalCase(CapitalizeFirstLetter(result));
            return result;
        }

        /// <summary>
        /// 输入查询SQL:输出查询SQL结果的插入语法(有字段限定、内容限定)
        /// </summary>
        /// <param name="freesql"></param>
        /// <param name="sql"></param>
        /// <param name="tablename"></param>
        /// <returns></returns>
        public static string GetInsertSQLBySQL(IFreeSql freesql, string sql ,string tablename = "YourTableName")
        {
            try
            {
                StringBuilder sb = new StringBuilder();
                var table = freesql.Select<object>().WithSql(sql).ToDataTable();
                List<string> ColumnsList = new List<string>();
                var FeildCounts = table.Columns.Count;
                for (int i = 0; i < table.Columns.Count; i++)
                {
                    ColumnsList.Add(table.Columns[i].ColumnName);
                }
                
                for (int i = 0; i < table.Rows.Count; i++)
                {
                    var values = new List<string>();
                    for (int j = 0; j < FeildCounts; j++)
                    {
                        var value = table.Rows[i][j].ToString();
                        // 对特殊字符进行转义,防止SQL注入或格式错误
                        values.Add($"'{value.Replace("'", "''")}'");
                    }
                    sb.AppendLine($"INSERT INTO {tablename} \n({string.Join(", ", ColumnsList)}) VALUES ({string.Join(", ", values)});");
                }

                return sb.ToString();
            }
            catch (Exception ex)
            {
                return $"出错了:{ex.Message.ToString()}";
            }

        }

        /// <summary>
        /// 输入表名,输出Crud语法
        /// </summary>
        /// <param name="freesql"></param>
        /// <param name="tablenamelist"></param>
        /// <returns></returns>
        public static string GetCrudByTableName(IFreeSql freesql, List<string> tablenamelist)
        {
            StringBuilder sb = new StringBuilder();
            foreach (var table in tablenamelist)
            {
                var dbinfo = freesql.DbFirst.GetTableByName(table);
                var ColumnsList = dbinfo.Columns.OrderBy(x=>x.Position).Select(x=>x.Name).ToList();
                var key = dbinfo.Primarys.FirstOrDefault()?.Name ?? "Id";
                sb.AppendLine($"SELECT \n\t{string.Join(",\n\t", ColumnsList)} \nFROM \t{table}\n");
                sb.AppendLine($"INSERT INTO {table} ({string.Join("\n\t,", ColumnsList)}) \nVALUES \n()\n");
                sb.AppendLine($"DELETE FROM {table} WHERE {key} IN ()\n");
                sb.AppendLine($"UPDATE {table} SET xxx=xxx WHERE {key} IN ()\n");
            }
            return sb.ToString();
        }
    }

三、生成实体版本2

 public static class Logical2
 {
     //生成实体类的方法
     public static string GetEntityGrammar(IFreeSql freesql, List<string> tablenames)
     {
         string output = "";
         foreach (var tablename in tablenames)
         {
             string result = $"[Table(\"{tablename}\")]\npublic class {ConvertToPascalCase(tablename)} //: DOEntity \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 += $"    [Description(\"{item.Coment}\")]\n";
                 }
                 if (item.Name.ToLower().Equals("id"))
                 {
                     feild += $"    [Column(\"{item.Name}\")] //[FreeSql.DataAnnotations.Column(IsPrimary =true,IsIdentity =true)]\n";
                     feild += $"    public {cstype} {item.Name} {{ get; set; }} //主键:Id ({cstype})\n\n";
                 }
                 else
                 {
                     feild += $"    [Column(\"{item.Name}\")]\n";
                     feild += $"    public {cstype} {GetFormatName(item.Name)} {{ get; set; }}\n\n";
                 }

                 result += feild;
             }
             result += "}";
             output += result + "\n";
         }
         return output;
     }

     private static string GetFormatName(string name)
     {
         string result = name;
         foreach (var item in KeyWordsUpFirst)
         {
             result = result.Replace(item, CapitalizeFirstLetter(item));
         }
         foreach (var item in KeyWordsAllUp)
         {
             result = result.Replace(item, item.ToUpper());
         }
         foreach (var item in ReplaceDict)
         {
             result = result.Replace(item.Value,item.Key);
         }
         result = ConvertToPascalCase(CapitalizeFirstLetter(result));
         return result;
     }

     //转化词(首字母大写)
     private static List<string> KeyWordsUpFirst = new List<string> { "code", "name", "value", "time", "state", "path", "point", "type", "mark", "user", "log", "status", "data", "flag", "pollutant", "url", "date", "speed", "direct","rank", "order", "district","town", "city" ,"key"};


     //转化词(全大写)
     private static List<string> KeyWordsAllUp = new List<string> { "aqi", "pm", "no", "so", "co", "tsi" };

     //最后替换字典(用key替代value)
     private static Dictionary<string,string> ReplaceDict = new Dictionary<string, string>()
     {
         {"Reason","ReaSOn" },{"Update","UpDate" }
     };

     //下划线转大驼峰
     private static string ConvertToPascalCase(string input)
     {
         // 分割字符串
         string[] words = input.Split('_');

         // 将每个单词的首字母大写并连接
         for (int i = 0; i < words.Length; i++)
         {
             if (words[i].Length > 0)
             {
                 words[i] = char.ToUpper(words[i][0]) + words[i].Substring(1);
             }
         }

         // 返回连接后的结果
         return string.Join(string.Empty, words);
     }

     //首字母大写
     static string CapitalizeFirstLetter(string str)
     {
         if (string.IsNullOrEmpty(str))
             return str; // 返回原始字符串,或可以返回空字符串

         return char.ToUpper(str[0]) + str.Substring(1);
     }
 }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务