ASP.NET中实现根据匿名类、datatable、sql生成实体类

   这篇文章主要介绍了ASP.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 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;
}
}
}

  调用如下:

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

//通过匿名对象生成实体类
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

时间: 2024-10-03 15:37:42

ASP.NET中实现根据匿名类、datatable、sql生成实体类的相关文章

ASP.NET中实现根据匿名类、datatable、sql生成实体类_实用技巧

在开发中可能会遇到这几种情况: 1.EF或LINQ查询出来的匿名对象在其它地方调用不方便,又懒的手动建实体类 2.通过datatable反射实体需要先建一个类 ,头痛 3.通过SQL语句返回的实体也需要先建一个类 ,头痛 4.如果通过代码生成器要写模版,需要安装或者不想生成一堆不用的类    为了解决上面的不便之处,我封装了一个实体生成类,可以扔到程序里面任意调用 封装类: using System; using System.Collections.Generic; using System.

如何通过DataTable的列名 生成实体类,列名为类的属性 求大神帮忙

问题描述 现在需要DataTable动态生成实体类,有没有什么好的办法,求大神帮忙 解决方案 解决方案二:动态生成实体类?根据列名映射到POCO属性可以做到,但动态创建实体类?那只能dynamic了解决方案三:"动态生成实体类"的概念是什么呢?是写一个编写代码的机器狗?解决方案四:引用2楼sp1234的回复: "动态生成实体类"的概念是什么呢?是写一个编写代码的机器狗? 比如我将datatable作为参数传入方法,方法返回一个类的实体,里边的字段为这个类的属性解决方

ASP.NET中实现把form表单元素转为实体对象或集合

这篇文章主要介绍了ASP.NET中实现把form表单元素转为实体对象或集合,本文又是一个对重复数据处理的一个封装,非常实用的开发技巧,需要的朋友可以参考下     简介: 做WEBFROM开发的同学都知道后台接收参数非常麻烦 虽然MVC中可以将表单直接转为集实,但不支持表单转为 LIST<T>这种集合 单个对象的用法: 表单:   代码如下: <input name='id' value='1' > <input name='sex' value='男' >   后台:

asp.net如何动态生成实体类

问题描述 最近做项目需要数据库表能动态生成实体类,因为数据表结构不一定,所以做成动态的,以免以后改了数据库还要改实体类.求各位大神指教解决方法. 解决方案 解决方案二:Database.SetInitializer(newMigrateDatabaseToLatestVersion<XXXContext,Configuration>())

数据库表生成实体类

问题描述 各种框架,不少都是数据库表生成实体类,讨论一下为何要把表对应一个类?直接sql操作数据库表也不错呀 解决方案 解决方案二:引用楼主zhuce2015的回复: 各种框架,不少都是数据库表生成实体类,讨论一下为何要把表对应一个类?直接sql操作数据库表也不错呀 把表生成实体类,可以List<实体类>在程序中使用,这样的话遍历List<>的时候可以通过实体类找到属性名称直接sql填充到DataTable,遍历DataTable的时候,你要么通过列索引.要么通过列名,不如使用实体

hibernate-Hibernate可以自动生成实体类的增删改查的方法吗?

问题描述 Hibernate可以自动生成实体类的增删改查的方法吗? Hibernate可以自动生成实体类的增删改查的方法吗? Hibernate可以自动生成实体类的增删改查的方法吗? 解决方案 可以,MyEclipse的反向工程有这个功能 解决方案二: Hibernate自动生成实体类 解决方案三: 可以的. 在Myeclipse中,正逆向工程操作比较简单,而如果是eclipse的话,会比较麻烦,因为必须要先配置下Hibernate环境(同理如果要生成其他持久化层框架的实体类,也需要先配置).

MyEclipse逆向生成实体类和Hibernate映射文件

开发项目涉及到的表太多,一个一个的写JAVA实体类很是费事.MyEclipse提供简便的方法:反向数据库 步骤大致如下: 第一步: window-->open Perspective-->MyEclipse Java Persistence 操作后会出现一个视图DB Brower:MyEclipse Derby 在空白区点击右键,新建一个数据库对象.我用的是mysql,其实我一直想用oracle之类的,只是机子内存小,又懒得倒腾别的,结果截个图吧: 左边的属性按照自己使用的数据库填就行了,左边

LINQ to SQL 建立实体类

原文:LINQ to SQL 建立实体类 使用LINQ to SQL时,需要首先建立用于映射数据库对象的模型,也就是实体类.在运行时,LINQ to SQL 根据LINQ表达式或查询运算符生成SQL语句,发送到数据库进行操作.数据库返回后,LINQ to SQL负责将结果转换成实体类对象. 建立实体类的方法有很多,例如LINQ to SQL设计器,手动编码建立,使用XML文件映射,使用命令行工具SqlMetal生成等.其中最方便的就是LINQ to SQL设计器. 1.使用LINQ to SQL

用codesmith生成实体类问题?

问题描述 用codesmith生成实体类后,然后生成相应的其他两层代码,在使用的过程中发现,需要在添加一个字段,如果把代码在生成一遍后进行覆盖的话,那自己之后手动写的代码就会被覆盖,这样显然是行不通的,请问谁有更好的方法?