温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

利用ASP.NET怎么不行个根据匿名类和datatable

发布时间:2020-12-18 14:45:56 来源:亿速云 阅读:178 作者:Leah 栏目:开发技术

本篇文章为大家展示了利用ASP.NET怎么不行个根据匿名类和datatable,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

在开发中可能会遇到这几种情况:

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>   /// ** 描述:实体生成类   /// ** 创始时间: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;     }   } }

调用如下:

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

利用ASP.NET怎么不行个根据匿名类和datatable

上述内容就是利用ASP.NET怎么不行个根据匿名类和datatable,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI