• .net 根据匿名类生成实体类,根据datatable生成实体类,根据sql生成实体类


    在开发中可能会遇到这几种情况

    1、EF或LINQ查询出来的匿名对象在其它地方调用不方便,又懒的手动建实体类

    2、通过datatable反射实体需要先建一个类 ,头痛

    3、通过SQL语句返回的实体也需要先建一个类 ,头痛

    4、如果通过代码生成器要写模版,需要安装或者不想生成一堆不用的类  

    为了解决上面的不便之处,我封装了一个实体生成类,可以扔到程序里面任意调用

    封装类:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using System.Data.SqlClient;
    using System.Text.RegularExpressions;
    
    namespace SyntacticSugar
    {
        /// <summary>
        /// ** 描述:实体生成类
        /// ** 创始时间:2015-4-17
        /// ** 修改时间:-
        /// ** 作者:sunkaixuan
        /// ** qq:610262374 欢迎交流,共同提高 ,命名语法等写的不好的地方欢迎大家的给出宝贵建议
        /// </summary>
        public class ClassGenerating
        {
            /// <summary>
            /// 根据匿名类获取实体类的字符串
            /// </summary>
            /// <param name="entity">匿名对象</param>
            /// <param name="className">生成的类名</param>
            /// <returns></returns>
            public static string DynamicToClass(object entity, string className)
            {
                StringBuilder reval = new StringBuilder();
                StringBuilder propertiesValue = new StringBuilder();
                var propertiesObj = entity.GetType().GetProperties();
                string replaceGuid = Guid.NewGuid().ToString();
                string nullable = string.Empty;
                foreach (var r in propertiesObj)
                {
    
                    var type = r.PropertyType;
                    if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
                    {
                        type = type.GetGenericArguments()[0];
                        nullable = "?";
                    }
                    if (!type.Namespace.Contains("System.Collections.Generic"))
                    {
                        propertiesValue.AppendLine();
                        string typeName = ChangeType(type);
                        propertiesValue.AppendFormat("public {0}{3} {1} {2}", typeName, r.Name, "{get;set;}", nullable);
                        propertiesValue.AppendLine();
                    }
                }
    
                reval.AppendFormat(@"
                     public class {0}{{
                            {1}
                     }}
                ", className, propertiesValue);
    
    
                return reval.ToString();
            }
     
    
            /// <summary>
            /// 根据DataTable获取实体类的字符串
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="className"></param>
            /// <returns></returns>
            public static string DataTableToClass(DataTable dt, string className)
            {
                StringBuilder reval = new StringBuilder();
                StringBuilder propertiesValue = new StringBuilder();
                string replaceGuid = Guid.NewGuid().ToString();
                foreach (DataColumn r in dt.Columns)
                {
                    propertiesValue.AppendLine();
                    string typeName = ChangeType(r.DataType);
                    propertiesValue.AppendFormat("public {0} {1} {2}", typeName, r.ColumnName, "{get;set;}");
                    propertiesValue.AppendLine();
                }
                reval.AppendFormat(@"
                     public class {0}{{
                            {1}
                     }}
                ", className, propertiesValue);
    
    
                return reval.ToString();
            }
    
            /// <summary>
            ///  根据SQL语句获取实体类的字符串
            /// </summary>
            /// <param name="sql">SQL语句</param>
            /// <param name="className">生成的类名</param>
            /// <param name="server">服务名</param>
            /// <param name="database">数据库名称</param>
            /// <param name="uid">账号</param>
            /// <param name="pwd">密码</param>
            /// <returns></returns>
            public static string SqlToClass(string sql, string className, string server, string database, string uid, string pwd)
            {
                using (SqlConnection conn = new SqlConnection(string.Format("server={0};uid={2};pwd={3};database={1}", server, database, uid, pwd)))
                {
                    SqlCommand command = new SqlCommand();
                    command.Connection = conn;
                    command.CommandText = sql;
                    DataTable dt = new DataTable();
                    SqlDataAdapter sad = new SqlDataAdapter(command);
                    sad.Fill(dt);
                    var reval = DataTableToClass(dt, className);
                    return reval;
                }
            }
            /// <summary>
            ///  根据SQL语句获取实体类的字符串
            /// </summary>
            /// <param name="sql">SQL语句</param>
            /// <param name="className">生成的类名</param>
            /// <param name="connName">webconfig的connectionStrings name</param>
            /// <returns></returns>
            public static string SqlToClass(string sql, string className, string connName)
            {
                string connstr = System.Configuration.ConfigurationManager.ConnectionStrings[connName].ToString();
                if (connstr.Contains("metadata"))//ef
                    connstr = Regex.Match(connstr, @"connection string\=""(.+)""").Groups[1].Value;
                using (SqlConnection conn = new SqlConnection(connstr))
                {
                    SqlCommand command = new SqlCommand();
                    command.Connection = conn;
                    command.CommandText = sql;
                    DataTable dt = new DataTable();
                    SqlDataAdapter sad = new SqlDataAdapter(command);
                    sad.Fill(dt);
                    var reval = DataTableToClass(dt, className);
                    return reval;
                }
            }
            /// <summary>
            /// 匹配类型
            /// </summary>
            /// <param name="type"></param>
            /// <returns></returns>
            private static string ChangeType(Type type)
            {
                string typeName = type.Name;
                switch (typeName)
                {
                    case "Int32": typeName = "int"; break;
                    case "String": typeName = "string"; break;
                }
                return typeName;
            }
        }
    }
    

      

    调用如下:

               //通过匿名对象生成实体类
                var dynamicObj = new { id = 1, name = "小名", entity = new enityt1() };
    //注意:只能是单个实体不能传入 List<T> ,集合需要 List[0]
    string classCode = ClassGenerating.DynamicToClass(dynamicObj, "classDynamic"); //通过datatable生成实体类 DataTable dt = new DataTable(); dt.Columns.Add("Id", typeof(int)); dt.Columns.Add("Name"); classCode = ClassGenerating.DataTableToClass(dt, "classTatabale"); //通过sql语句生成实体类 classCode = ClassGenerating.SqlToClass("select * from note", "Note", "127.0.0.1", "MyWork", "sa", "sasa"); classCode = ClassGenerating.SqlToClass("select * from dbo.AccessoriesDetail", "AccessoriesDetail", "NFDEntities");//通过 config connstring名称

    然后在调试状态把你需要的结果CTRL+C 然后去新建一个类CTRL+V

  • 相关阅读:
    git push错误,如何回滚
    mybatis类型转换器
    SpringBoot2 + Druid + Mybatis 多数据源动态配置
    从SqlSessionFactoryBean的引用浅谈spring两种bean模式
    maven常用命令
    ubuntu 16.04安装mysql server入门
    HTML5多文件异步上传 个人笔记代码
    sqlserver中取出刚插入的主键(主键是guid类型)
    快速排序示例代码
    oracle用户创建及权限设置(转)
  • 原文地址:https://www.cnblogs.com/sunkaixuan/p/4482152.html
Copyright © 2020-2023  润新知