最近对接一个接口,需要通过xml序列化成实体后添加额外信息后批量插入数据库,需要手动拼sql。因为涉及多张表,拼凑很麻烦而且容易出错,所以写了两个工具方法来生成sql,先写到博客里面,以便以后不时之需。

直接上工具方法,是通过反射机制来拼凑的sql语句,EF底层实现原理差不多。

1.实体生成Insert语句

 /// <summary>
/// 通过反射生成sql语句
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity">实体</param>
/// <param name="tableName">表名称</param>
/// <returns></returns>
public static string InsertSql<T>(T entity,string tableName="")where T:class
{
return entity == null || "".Equals(entity) ? string.Empty : $" INSERT INTO {tableName??entity.GetType().Name} ({string.Join(",", entity.GetType().GetProperties().Select(t => $"[{t.Name}]"))}) Values({string.Join(",",entity.GetType().GetProperties().Select(t=>$"'{t.GetValue(entity)}'"))})";
}

2.实体生成Update语句,主键字段需要自己指定

   /// <summary>
/// 通过反射生成sql语句
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity">实体</param>
/// <param name="value">值</param>
/// <param name="key">条件字段</param>
/// <param name="tableName">表名称</param> public static string UpdateSql<T>(T entity, object value,string key, string tableName = "") where T:class
{
return entity==null || "".Equals(entity) || value==null || "".Equals(value) ? string.Empty: $" UPDATE {tableName??entity.GetType().Name} SET {string.Join(",", entity.GetType().GetProperties().Select(t => $"[{t.Name}]='{t.GetValue(entity)}'"))} WHERE {key}='{value}'";
}

随便造个实体:

 public class UserEntity
{
/// <summary>
/// 主键
/// </summary>
public string Id { get; set; }
public string Name { get; set; }
public string Adress { get; set; }
public int Age { get; set; }
public string Sex { get; set; }
public string Phone { get; set; }
public bool? Enabled { get; set; }
public DateTime? CreateTime { get; set; }
}

测试代码如下:

UserEntity user = new UserEntity()
{
Name = "张三",
Adress = "中国",
Age = ,
Sex = "男",
Phone = "",
Id = "",
Enabled = true,
CreateTime = DateTime.Now
};
Console.WriteLine("***********************实体生成Update语句****************************");
Console.WriteLine(UpdateSql(user, ,"Id", "TestUser"));
Console.WriteLine("***********************实体生成Insert语句****************************");
Console.WriteLine(InsertSql(user, "TestUser"));
Console.ReadKey();

执行结果:

如有不到之处,敬请指出。

ASP.NET通过反射生成sql语句的更多相关文章

  1. 反射生成SQL语句入门

    今天我们来学习学习通过反射技术来生成SQL语句. 反射提供了封装程序集.模块和类型的对象.您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型.然后,可以调用类型的方法或访 ...

  2. 利用反射生成SQL语句

    // 修改学员信息的方法 public bool ModifyStudent(MODEL.Students model) { // 利用反映获取类对所有属性,用来动态生成SQL语句 StringBui ...

  3. 4、注解反射生成SQL语句

    .任务说明         ①有一张用户表,字段包括:用户ID.用户名.昵称.年龄.性别.所在城市.邮箱.手机号:         ②使用java注解来对用户表的每个字段或字段的组合条件进行动态生成S ...

  4. 根据反射生成SQL语句

    /** * 基础查询语句 * 返回类型的属性字符串Sql * @author: InkYi * 修改时间:2016年5月11日 - 上午10:06:00<br/> * 功能说明:<b ...

  5. 通过自定义注解反射生成SQL语句

    ----------------------------------------Program.cs---------------------------------------- using Sys ...

  6. C# - 通过自定义注解反射生成SQL语句[转]

    转自http://blog.163.com/jong_cai/blog/static/87028045200902033553581/ -------------------------------- ...

  7. 反射生成SQL语句

    public static int Reg(Model ml) { bool b = true; Visit vt = new Visit(); StringBuilder builder = new ...

  8. 利用反射自动生成SQL语句(仿Linq)

    转:http://www.cnblogs.com/the7stroke/archive/2012/04/22/2465597.html using System; using System.Colle ...

  9. Excel数据生成Sql语句的方法

    选中想要生成的列,套用表格格式,选中表包含标题的选项确定,然后在最右边的一列第二行处,点击函数功能,选择CONCATENATE,在文本里输入想要的结构即可  代码如下 复制代码 ,=CONCATENA ...

随机推荐

  1. CSP 2019 RP++

    读入:(转自:chuyds's Blog 法一: while(scanf("%d",&a)!=EOF) 法二: while(cin>>n) 法三: while( ...

  2. 首探:Ruby on Rails 简单了解

    一. 安装 Ruby安装:https://ruby-china.org/wiki/rvm-guide 注:安装了RVM和Gem后 安装rails: gem install rails -v 5.1.4 ...

  3. Spring 自定义注解,结合AOP,配置简单日志注解 (转)

    java在jdk1.5中引入了注解,spring框架也正好把java注解发挥得淋漓尽致. 下面会讲解Spring中自定义注解的简单流程,其中会涉及到spring框架中的AOP(面向切面编程)相关概念. ...

  4. qq 面对面传文件,应用

    使用方式:打开qq,点击右上角里面的面对面传 传输内容:应用,文件 好处:不耗流量,快速

  5. Spring Cloud Gateway真的有那么差吗?

    动机 已经不止一次看到"Spring Cloud Gateway性能比Zuul更差"的言论了,不少人人云亦云,来问我,既然如此,那Spring官方还开发Spring Cloud G ...

  6. Java web验证码——kaptcha的使用

    一.配置kaptcha的jar包 pom.xml配置: <-- 目前只有2.3.2版本--> <!-- https://mvnrepository.com/artifact/com. ...

  7. asp.net core在发布时排除配置文件

    使用命令发布 dotnet restore dotnet publish -c Release -r win-x64 -o "D:\services" 这样发布总是是将配置文件覆盖 ...

  8. leetcode 1267. Count Servers that Communicate

    You are given a map of a server center, represented as a m * n integer matrix grid, where 1 means th ...

  9. O011、理解 virbr0

    参考https://www.cnblogs.com/CloudMan6/p/5308071.html   virbr0 是KVM 默认创建的一个Bridge ,其作用是为该宿主机上的虚机提供NAT上网 ...

  10. jumpserver开源堡垒机部署安装

    0x01.前言 Jumpserver 是全球首款完全开源的堡垒机,使用 GNU GPL v2.0 开源协议,是符合 4A 的专业运维审计系统. Jumpserver 使用 Python / Djang ...