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


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

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

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

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

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

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

    封装类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    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 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

  • 相关阅读:
    Linux自动批量增加公钥
    主机存活监控
    [Linux小技巧] 将 rm 命令删除的文件放在回收站
    Linux常见问题及命令
    数据分析职位招聘情况及发展前景分析
    SQL查询小案例
    Oracle查看表结构
    前端JSON请求转换Date问题
    Centos7最小化安装
    拓词和扇贝有何不同
  • 原文地址:https://www.cnblogs.com/lsgsanxiao/p/7111143.html
Copyright © 2020-2023  润新知