ASP.NET中實(shí)現(xiàn)根據(jù)匿名類(lèi)、datatable、sql生成實(shí)體類(lèi)
在開(kāi)發(fā)中可能會(huì)遇到這幾種情況:
1、EF或LINQ查詢(xún)出來(lái)的匿名對(duì)象在其它地方調(diào)用不方便,又懶的手動(dòng)建實(shí)體類(lèi)
2、通過(guò)datatable反射實(shí)體需要先建一個(gè)類(lèi) ,頭痛
3、通過(guò)SQL語(yǔ)句返回的實(shí)體也需要先建一個(gè)類(lèi) ,頭痛
4、如果通過(guò)代碼生成器要寫(xiě)模版,需要安裝或者不想生成一堆不用的類(lèi)
為了解決上面的不便之處,我封裝了一個(gè)實(shí)體生成類(lèi),可以扔到程序里面任意調(diào)用
封裝類(lèi):
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í)體生成類(lèi) /// ** 創(chuàng)始時(shí)間:2015-4-17 /// ** 修改時(shí)間:- /// ** 作者:sunkaixuan /// ** qq:610262374 歡迎交流,共同提高 ,命名語(yǔ)法等寫(xiě)的不好的地方歡迎大家的給出寶貴建議 /// </summary> public class ClassGenerating { /// <summary> /// 根據(jù)匿名類(lèi)獲取實(shí)體類(lèi)的字符串 /// </summary> /// <param name="entity">匿名對(duì)象</param> /// <param name="className">生成的類(lèi)名</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í)體類(lèi)的字符串 /// </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í)體類(lèi)的字符串 /// </summary> /// <param name="sql">SQL語(yǔ)句</param> /// <param name="className">生成的類(lèi)名</param> /// <param name="server">服務(wù)名</param> /// <param name="database">數(shù)據(jù)庫(kù)名稱(chēng)</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í)體類(lèi)的字符串 /// </summary> /// <param name="sql">SQL語(yǔ)句</param> /// <param name="className">生成的類(lèi)名</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> /// 匹配類(lèi)型 /// </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)用如下:
//通過(guò)匿名對(duì)象生成實(shí)體類(lèi) var dynamicObj = new { id = 1, name = "小名", entity = new enityt1() }; //注意:只能是單個(gè)實(shí)體不能傳入 List<T> ,集合需要 List[0] string classCode = ClassGenerating.DynamicToClass(dynamicObj, "classDynamic"); //通過(guò)datatable生成實(shí)體類(lèi) DataTable dt = new DataTable(); dt.Columns.Add("Id", typeof(int)); dt.Columns.Add("Name"); classCode = ClassGenerating.DataTableToClass(dt, "classTatabale"); //通過(guò)sql語(yǔ)句生成實(shí)體類(lèi) classCode = ClassGenerating.SqlToClass("select * from note", "Note", "127.0.0.1", "MyWork", "sa", "sasa"); classCode = ClassGenerating.SqlToClass("select * from dbo.AccessoriesDetail", "AccessoriesDetail", "NFDEntities");//通過(guò) config connstring名稱(chēng)
然后在調(diào)試狀態(tài)把你需要的結(jié)果CTRL+C 然后去新建一個(gè)類(lèi)CTRL+V
- Kotlin基礎(chǔ)教程之伴生對(duì)象,getter,setter,內(nèi)部,局部,匿名類(lèi),可變參數(shù)
- java 中使用匿名類(lèi)直接new接口詳解及實(shí)例代碼
- Java中匿名類(lèi)的兩種實(shí)現(xiàn)方式
- java 內(nèi)部類(lèi)(匿名類(lèi),匿名對(duì)象,靜態(tài)內(nèi)部類(lèi))詳解及實(shí)例
- PHP7匿名類(lèi)用法分析
- 使用 Lambda 取代 Android 中的匿名類(lèi)
- 全面了解Java中的內(nèi)部類(lèi)和匿名類(lèi)
- 深入講解C#編程中嵌套類(lèi)型和匿名類(lèi)型的定義與使用
- 詳細(xì)解讀C++編程中的匿名類(lèi)類(lèi)型和位域
- Java通過(guò)匿名類(lèi)來(lái)實(shí)現(xiàn)回調(diào)函數(shù)實(shí)例總結(jié)
相關(guān)文章
asp.net實(shí)現(xiàn)生成縮略圖及給原始圖加水印的方法示例
這篇文章主要介紹了asp.net實(shí)現(xiàn)生成縮略圖及給原始圖加水印的方法,結(jié)合具體實(shí)例形式分析了asp.net圖片的縮略圖與水印操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-10-10Coolite優(yōu)化導(dǎo)出Excel文件實(shí)現(xiàn)代碼
Coolite 優(yōu)化 導(dǎo)出 Excel 文件??梢栽O(shè)定列寬和導(dǎo)出列選擇。2010-03-03ASP.NET中Web.config文件的層次關(guān)系詳細(xì)介紹
Web.config 是一個(gè)基于 XML 的配置文件,該文件的作用是對(duì)應(yīng)用程序進(jìn)行配置,下面為大家介紹下ASP.NET中Web.config文件的層次關(guān)系2014-01-01.NET 解決TabControl 頁(yè)里面多余邊距問(wèn)題經(jīng)驗(yàn)分享
不知道各位同學(xué)有沒(méi)有遇到在向TabPage添加內(nèi)容后,里面的東西總是填不滿(mǎn) TabPage,總是有幾個(gè)像素的空白邊距2012-04-04使用DataGrid中擴(kuò)展ItemRenderer和HeaderRenderer進(jìn)行操作
這兩天在用Flex DataGrid做點(diǎn)東西,走了不少?gòu)澛?,現(xiàn)將心得分享一下。2009-02-02基于.NET程序默認(rèn)啟動(dòng)線(xiàn)程數(shù)講解
本篇文章小編為大家介紹,基于.NET程序默認(rèn)啟動(dòng)線(xiàn)程數(shù)講解。需要的朋友參考下2013-04-04ASP.NET Core3.1 Ocelot負(fù)載均衡的實(shí)現(xiàn)
這篇文章主要介紹了ASP.NET Core3.1 Ocelot負(fù)載均衡的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11