ASP.NET中實(shí)現(xiàn)根據(jù)匿名類、datatable、sql生成實(shí)體類
在開發(fā)中可能會(huì)遇到這幾種情況:
1、EF或LINQ查詢出來的匿名對(duì)象在其它地方調(diào)用不方便,又懶的手動(dòng)建實(shí)體類
2、通過datatable反射實(shí)體需要先建一個(gè)類 ,頭痛
3、通過SQL語(yǔ)句返回的實(shí)體也需要先建一個(gè)類 ,頭痛
4、如果通過代碼生成器要寫模版,需要安裝或者不想生成一堆不用的類
為了解決上面的不便之處,我封裝了一個(gè)實(shí)體生成類,可以扔到程序里面任意調(diào)用
封裝類:
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>
/// ** 描述:實(shí)體生成類
/// ** 創(chuàng)始時(shí)間:2015-4-17
/// ** 修改時(shí)間:-
/// ** 作者:sunkaixuan
/// ** qq:610262374 歡迎交流,共同提高 ,命名語(yǔ)法等寫的不好的地方歡迎大家的給出寶貴建議
/// </summary>
public class ClassGenerating
{
/// <summary>
/// 根據(jù)匿名類獲取實(shí)體類的字符串
/// </summary>
/// <param name="entity">匿名對(duì)象</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>
/// 根據(jù)DataTable獲取實(shí)體類的字符串
/// </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>
/// 根據(jù)SQL語(yǔ)句獲取實(shí)體類的字符串
/// </summary>
/// <param name="sql">SQL語(yǔ)句</param>
/// <param name="className">生成的類名</param>
/// <param name="server">服務(wù)名</param>
/// <param name="database">數(shù)據(jù)庫(kù)名稱</param>
/// <param name="uid">賬號(hào)</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>
/// 根據(jù)SQL語(yǔ)句獲取實(shí)體類的字符串
/// </summary>
/// <param name="sql">SQL語(yǔ)句</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;
}
}
}
調(diào)用如下:
//通過匿名對(duì)象生成實(shí)體類
var dynamicObj = new { id = 1, name = "小名", entity = new enityt1() };
//注意:只能是單個(gè)實(shí)體不能傳入 List<T> ,集合需要 List[0]
string classCode = ClassGenerating.DynamicToClass(dynamicObj, "classDynamic");
//通過datatable生成實(shí)體類
DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name");
classCode = ClassGenerating.DataTableToClass(dt, "classTatabale");
//通過sql語(yǔ)句生成實(shí)體類
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名稱
然后在調(diào)試狀態(tài)把你需要的結(jié)果CTRL+C 然后去新建一個(gè)類CTRL+V

- Kotlin基礎(chǔ)教程之伴生對(duì)象,getter,setter,內(nèi)部,局部,匿名類,可變參數(shù)
- java 中使用匿名類直接new接口詳解及實(shí)例代碼
- Java中匿名類的兩種實(shí)現(xiàn)方式
- java 內(nèi)部類(匿名類,匿名對(duì)象,靜態(tài)內(nèi)部類)詳解及實(shí)例
- PHP7匿名類用法分析
- 使用 Lambda 取代 Android 中的匿名類
- 全面了解Java中的內(nèi)部類和匿名類
- 深入講解C#編程中嵌套類型和匿名類型的定義與使用
- 詳細(xì)解讀C++編程中的匿名類類型和位域
- Java通過匿名類來實(shí)現(xiàn)回調(diào)函數(shù)實(shí)例總結(jié)
相關(guān)文章
asp.net中引用同一個(gè)項(xiàng)目中的類庫(kù) 避免goToDefinition時(shí)不能到達(dá)真正的定義類
asp.net中引用同一個(gè)項(xiàng)目中的類庫(kù) 避免 goToDefinition時(shí)不能到達(dá)真正的定義類2011-10-10
Consul的搭建和.Net5的注冊(cè)和獲取方法(Win10簡(jiǎn)單版)
Consul?是一個(gè)用來實(shí)現(xiàn)分布式系統(tǒng)服務(wù)發(fā)現(xiàn)與配置的開源工具。接下來通過本文給大家介紹win10下Consul的搭建和.Net5的注冊(cè)和獲取方法,感興趣的朋友一起看看吧2022-01-01
GridView控件實(shí)現(xiàn)數(shù)據(jù)的修改(第9節(jié))
這篇文章主要介紹了GridView控件實(shí)現(xiàn)數(shù)據(jù)的修改,需要的朋友可以參考下2015-08-08
ASP.NET MVC使用jQuery Template實(shí)現(xiàn)批量更新
這篇文章介紹了ASP.NET MVC使用jQuery Template實(shí)現(xiàn)批量更新的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07

