.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
{
/// <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生成实体类的更多相关文章
- 缓存策略 半自动化就是mybaitis只支持数据库查出的数据映射到pojo类上,而实体到数据库的映射需要自己编写sql语句实现,相较于hibernate这种完全自动化的框架我更喜欢mybatis
springboot入门(三)-- springboot集成mybatis及mybatis generator工具使用 - FoolFox - CSDN博客 https://blog.csdn.net ...
- 强类型sql生成助手类
不使用表达式树,使用强类型生成where子句,好处是性能高,相比表达式树生成的sql,10倍+ 目前只支持生成where条件.查询语句,后期会增加生成Update SQL where子句支持相等.比较 ...
- 使用原生SQL返回实体类具体实现详情
注:可以直接复制粘贴,欢迎提出各种问题,谢谢! 因为网上查询大都是相同的,自己做时发现很多不懂,摸索了很久才弄懂,所以写了这个例子,比较容易看懂吧. 使用原生SQL查询并将结果返回实体中: (1)因为 ...
- Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成
前言 Rafy 领域实体框架作为一个使用领域驱动设计作为指导思想的开发框架,必然要处理领域实体到数据库表之间的映射,即包含了 ORM 的功能.由于在 09 年最初设计时,ORM 部分的设计并不是最重要 ...
- thrift之TTransport类体系原理及源码详细解析1-类结构和抽象基类
本章主要介绍Thrift的传输层功能的实现,传输的方式多种多样,可以采用压缩.分帧等,而这些功能的实现都是相互独立,和上一章介绍的协议类实现方式比较雷同,还是先看看这部分的类关系图,如下: 由上面的类 ...
- SqlHelper简单实现(通过Expression和反射)8.Sql Server数据处理类
这个类基本上就是调用EntityHelper,ExpressionHelper和ObjectHelper来进行各种完整SQL的拼接操作. using System; using System.Conf ...
- 正确理解Widget::Widget(QWidget *parent) :QWidget(parent)这句话(初始化列表中无法直接初始化基类的数据成员,所以你需要在列表中指定基类的构造函数)
最近有点忙,先发一篇我公众号的文章,以下是原文. /********原文********/ 最近很多学习Qt的小伙伴在我的微信公众号私信我,该如何理解下面段代码的第二行QWidget(parent) ...
- Java基础-继承-编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。
#29.编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight.小车类Car是Vehicle的子类,其中包含的属性有载人数 loader.卡车类T ...
- 【C#】SQL数据库助手类2.0(自用)
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...
- [原]Sql脚本压缩类。
精简的美丽 /* * Sql脚本压缩类. * 去掉sql语句中多余的空格,以减少sql脚本的文本长度 * * Author : goldli@163.com * DateTime : 2015/07/ ...
随机推荐
- 忘记hmailiserver邮件服务器后台登陆密码解决
进入后台进行hmailiserver的相关设置,发现登陆密码忘记了,如下图:
- IOS APP 国际化 程序内切换语言实现 不重新启动系统(支持项目中stroyboard 、xib 混用。完美解决方案)
上篇 IOS APP 国际化(实现不跟随系统语言,不用重启应用,代码切换stroyboard ,xib ,图片,其他资源 介绍了纯代码刷新 实现程序内切换语言. 但效率底下,也存在一些问题.暂放弃. ...
- 传统认知PK网络认知 刚子扯谈烤串认知
文/刚子 2013.7.23 提到认知,有太多的介绍,我就不在秀理论文字了,那样等于自我抄袭式的传播给大家,对于大家也没意思,可以推荐大家到百度里面搜索下”认知结构”,介绍的比我详细.同行老陈说的! ...
- Maven - 项目结构
一个基础的Maven Java项目结构图如下所示: Project Name |__________ pom.xml |__________ src | |__ ...
- scikit-learn主要模块和基本使用方法
从网上看到一篇总结的很不错的sklearn使用文档,备份勿忘. 引言 对于一些开始搞机器学习算法有害怕下手的小朋友,该如何快速入门,这让人挺挣扎的.在从事数据科学的人中,最常用的工具就是R和Pytho ...
- 百度语音识别(Baidu Voice) Android studio版本
已同步更新至个人blog:http://dxjia.cn/2016/02/29/baidu-voice-helper/ 最近在一个练手小项目里要用到语音识别,搜索了一下,比较容易集成的就算Baidu ...
- java利用透明的图片轮廓抠图
需要处理的图片: 1.png(空白区域为透明) 2.png 处理后的结果图片:result.png 代码如下: import java.awt.Graphics2D; import java.awt. ...
- Crystal Reports 支持的纸张种类
DefaultPaperSize Paper10x14 254 x 355.6 mm Paper11x17 279.4 x 431.8 mm PaperA3 A3 ?,297 x 420 mm Pap ...
- 写给已有编程经验的 Python 初学者的总结【转】
当我开始学习Python的时候,有些事我希望我一早就知道.我花费了很多时间才学会这些东西.我想要把这些重点都编纂到一篇文章当中.这篇文章的目标读者,是刚刚开始学习Python语言的有经验的程序员,想要 ...
- floor相关
select floor(@f*0.22) -- 直接可显示结果 create table demo( id ,), id1 int ) select * from demo insert into ...