栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > asp

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

asp 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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
{
  /// 
  /// ** 描述:实体生成类
  /// ** 创始时间:2015-4-17
  /// ** 修改时间:-
  /// ** 作者:sunkaixuan
  /// ** qq:610262374 欢迎交流,共同提高 ,命名语法等写的不好的地方欢迎大家的给出宝贵建议
  /// 
  public class ClassGenerating
  {
    /// 
    /// 根据匿名类获取实体类的字符串
    /// 
    /// 匿名对象
    /// 生成的类名
    /// 
    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();
    }
 
 
    /// 
    /// 根据DataTable获取实体类的字符串
    /// 
    /// 
    /// 
    /// 
    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();
    }
 
    /// 
    /// 根据SQL语句获取实体类的字符串
    /// 
    /// SQL语句
    /// 生成的类名
    /// 服务名
    /// 数据库名称
    /// 账号
    /// 密码
    /// 
    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;
      }
    }
    /// 
    /// 根据SQL语句获取实体类的字符串
    /// 
    /// SQL语句
    /// 生成的类名
    /// webconfig的connectionStrings name
    /// 
    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;
      }
    }
    /// 
    /// 匹配类型
    /// 
    /// 
    /// 
    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 ,集合需要  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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/56846.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号