.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

 

转载于:https://www.cnblogs.com/lsgsanxiao/p/7111143.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值