最近对接一个接口,需要通过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();

执行结果:

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

最新文章

  1. [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计
  2. Centos6版本升级
  3. LINQ to SQL语句非常详细(原文来自于网络)
  4. POJ 1845 Sumdiv 【逆元】
  5. Tomcat中xml文件引入各种schma xsd问题原理
  6. UI:关于RGB与16进制颜色值的转换
  7. JavaScript--匿名函数和闭包(16)
  8. SQL server 常见用法记录
  9. IIS 服务器 支持.apk文件的下载
  10. 如何把activity当成dialog
  11. 审计系统---堡垒机项目之strace追踪ssh
  12. Codeforces Round #369 (Div. 2) C. Coloring Trees 动态规划
  13. 实现DIV层内的文字垂直居中(转)
  14. go语言中文网中的资源
  15. dp入门:最长不下降序列
  16. java中字符与字节的编码关系
  17. 支付宝小程序自定义弹窗插件|支付宝dialog插件|model插件
  18. DW如何打开已经关闭的站点文件提示框
  19. SecureCRT 7在ubuntu下的破解方法
  20. 【转载】Web开发技术发展历史-版本2

热门文章

  1. asp.net之后台使用根目录运算符
  2. ABC130 Task F. Minimum Bounding Box
  3. thinkphp5.1 关于加载静态资源路径问题
  4. DockerFile 编译语法详解
  5. Postgresql 大小版本升级
  6. java中的重写总结
  7. spring boot配置定时任务设置
  8. (转)java并发编程:CopyOnWriteArrayList
  9. Java模板引擎性能对比
  10. eclipse编码格式(中文乱码)