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

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 = , 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

.net 根据匿名类生成实体类,根据datatable生成实体类,根据sql生成实体类的更多相关文章

  1. 缓存策略 半自动化就是mybaitis只支持数据库查出的数据映射到pojo类上,而实体到数据库的映射需要自己编写sql语句实现,相较于hibernate这种完全自动化的框架我更喜欢mybatis

    springboot入门(三)-- springboot集成mybatis及mybatis generator工具使用 - FoolFox - CSDN博客 https://blog.csdn.net ...

  2. 强类型sql生成助手类

    不使用表达式树,使用强类型生成where子句,好处是性能高,相比表达式树生成的sql,10倍+ 目前只支持生成where条件.查询语句,后期会增加生成Update SQL where子句支持相等.比较 ...

  3. 使用原生SQL返回实体类具体实现详情

    注:可以直接复制粘贴,欢迎提出各种问题,谢谢! 因为网上查询大都是相同的,自己做时发现很多不懂,摸索了很久才弄懂,所以写了这个例子,比较容易看懂吧. 使用原生SQL查询并将结果返回实体中: (1)因为 ...

  4. Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成

    前言 Rafy 领域实体框架作为一个使用领域驱动设计作为指导思想的开发框架,必然要处理领域实体到数据库表之间的映射,即包含了 ORM 的功能.由于在 09 年最初设计时,ORM 部分的设计并不是最重要 ...

  5. thrift之TTransport类体系原理及源码详细解析1-类结构和抽象基类

    本章主要介绍Thrift的传输层功能的实现,传输的方式多种多样,可以采用压缩.分帧等,而这些功能的实现都是相互独立,和上一章介绍的协议类实现方式比较雷同,还是先看看这部分的类关系图,如下: 由上面的类 ...

  6. SqlHelper简单实现(通过Expression和反射)8.Sql Server数据处理类

    这个类基本上就是调用EntityHelper,ExpressionHelper和ObjectHelper来进行各种完整SQL的拼接操作. using System; using System.Conf ...

  7. 正确理解Widget::Widget(QWidget *parent) :QWidget(parent)这句话(初始化列表中无法直接初始化基类的数据成员,所以你需要在列表中指定基类的构造函数)

    最近有点忙,先发一篇我公众号的文章,以下是原文. /********原文********/ 最近很多学习Qt的小伙伴在我的微信公众号私信我,该如何理解下面段代码的第二行QWidget(parent) ...

  8. Java基础-继承-编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。

    #29.编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight.小车类Car是Vehicle的子类,其中包含的属性有载人数 loader.卡车类T ...

  9. 【C#】SQL数据库助手类2.0(自用)

    using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...

  10. [原]Sql脚本压缩类。

    精简的美丽 /* * Sql脚本压缩类. * 去掉sql语句中多余的空格,以减少sql脚本的文本长度 * * Author : goldli@163.com * DateTime : 2015/07/ ...

随机推荐

  1. int android.graphics.Bitmap.getRowBytes()

    int android.graphics.Bitmap.getRowBytes() Return the number of bytes between rows in the bitmap's pi ...

  2. Apache Storm 的历史及经验教训——Nathan Marz【翻译】

    英文原文地址 中英文对照地址 History of Apache Storm and lessons learned --项目创建者 Nathan Marz Apache Storm 最近成为了ASF ...

  3. NCPC 2013: Dance Reconstruction

    题目大意 对一个初始矩阵进行置换操作,已知经K次置换后得到的矩阵为,求一组可能的. 样例解释 这里只选取第二组样例进行解释. 4 2 3 4 1 2 2 3 4 1 初始矩阵为,根据Sample Ou ...

  4. 修改maven一更新jre就变成1.5版本

    <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> ...

  5. centos 7 /etc/rc.local 开机不执行的问题

    最近发现centos7 的/etc/rc.local不会开机执行,于是认真看了下/etc/rc.local文件内容的就发现了问题的原因了 1 2 3 4 5 6 7 8 9 10 11 #!/bin/ ...

  6. database link

    create database link lims_qumas_supplyconnect to QPROCESSDEV identified by qprocessdevusing '(DESCRI ...

  7. ubuntu-16.04+-xxx-i386.iso :安装 Oracle 11gR2 数据库

    前言:说实在的,ubuntu 16.04以上很难安装oracle!其间走过了艰难的一段路! 重要附件:ubuntu16.04+-xxx-i386.iso_安装oracle所需的软件包.zip 特点: ...

  8. saiku缓存整理

    使用saiku的人,肯定都有这么一个经历,查询了一次多维分析数据表,第二次之后就特别快,因为它缓存了结果,可问题是过了一天,甚至几天,来源数据早都更换了,可还是这个缓存结果.问题来了,缓存不失效! 那 ...

  9. wav 转换到 flac

    参考自:http://so.trust.blog.163.com/blog/static/17188620020127197618621/ wav  无损无压缩: flac无损压缩 将 wav 转换到 ...

  10. ASP.NET 如何发现问题的方法

    1.打开IntelliTrace,查看遇到的问题: 2.打开IE8以上,按F12,启动js调试,查看遇到的错误: