ASP.NET中實現(xiàn)根據(jù)匿名類、datatable、sql生成實體類
在開發(fā)中可能會遇到這幾種情況:
1、EF或LINQ查詢出來的匿名對象在其它地方調用不方便,又懶的手動建實體類
2、通過datatable反射實體需要先建一個類 ,頭痛
3、通過SQL語句返回的實體也需要先建一個類 ,頭痛
4、如果通過代碼生成器要寫模版,需要安裝或者不想生成一堆不用的類
為了解決上面的不便之處,我封裝了一個實體生成類,可以扔到程序里面任意調用
封裝類:
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> /// ** 描述:實體生成類 /// ** 創(chuàng)始時間:2015-4-17 /// ** 修改時間:- /// ** 作者:sunkaixuan /// ** qq:610262374 歡迎交流,共同提高 ,命名語法等寫的不好的地方歡迎大家的給出寶貴建議 /// </summary> public class ClassGenerating { /// <summary> /// 根據(jù)匿名類獲取實體類的字符串 /// </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> /// 根據(jù)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> /// 根據(jù)SQL語句獲取實體類的字符串 /// </summary> /// <param name="sql">SQL語句</param> /// <param name="className">生成的類名</param> /// <param name="server">服務名</param> /// <param name="database">數(shù)據(jù)庫名稱</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> /// 根據(jù)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名稱
然后在調試狀態(tài)把你需要的結果CTRL+C 然后去新建一個類CTRL+V
相關文章
asp.net實現(xiàn)生成縮略圖及給原始圖加水印的方法示例
這篇文章主要介紹了asp.net實現(xiàn)生成縮略圖及給原始圖加水印的方法,結合具體實例形式分析了asp.net圖片的縮略圖與水印操作相關實現(xiàn)技巧,需要的朋友可以參考下2017-10-10Coolite優(yōu)化導出Excel文件實現(xiàn)代碼
Coolite 優(yōu)化 導出 Excel 文件。可以設定列寬和導出列選擇。2010-03-03.NET 解決TabControl 頁里面多余邊距問題經驗分享
不知道各位同學有沒有遇到在向TabPage添加內容后,里面的東西總是填不滿 TabPage,總是有幾個像素的空白邊距2012-04-04使用DataGrid中擴展ItemRenderer和HeaderRenderer進行操作
這兩天在用Flex DataGrid做點東西,走了不少彎路,現(xiàn)將心得分享一下。2009-02-02ASP.NET Core3.1 Ocelot負載均衡的實現(xiàn)
這篇文章主要介紹了ASP.NET Core3.1 Ocelot負載均衡的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11