zoukankan      html  css  js  c++  java
  • .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

  • 相关阅读:
    windows phone 8 开发系列(三)程序清单说明与配置
    windows phone 8 开发系列(二)Hello Wp8!
    windows phone 8 开发系列(一)环境搭建
    MVC3 ViewBage 输出的值 被编码
    汉字取首字母拼音 ---vue---js
    一个基于POI的通用excel导入导出工具类的简单实现及使用方法
    MongoDB基础命令笔记
    Maven多模块,Dubbo分布式服务框架,SpringMVC,前后端分离项目,基础搭建,搭建过程出现的问题
    jQuery与ajax 基础运用
    mysql常处理用时间sql语句
  • 原文地址:https://www.cnblogs.com/lsgsanxiao/p/7111143.html
Copyright © 2011-2022 走看看