目前有很多开源的ORM项目,大多情况下也不需要我们重复去造轮子,我们只需要了解轮子怎么造的,怎么用就可以,下面简单说一下怎么通过实体生成一个SQL语句;

先建立2个Attribute类,TableAttribute、ColumnAttribute   , 且希望TableAttribute只想标记在实体类上,所以限制 [AttributeUsage(AttributeTargets.Class)],而希望ColumnAttribute只标记在属性上 [AttributeUsage(AttributeTargets.Property)]

  1. [AttributeUsage(AttributeTargets.Class)]
  2. public class TableAttribute : Attribute
  3. {
  4. private string _TableName = "";
  5. public TableAttribute(string TableName)
  6. {
  7. this._TableName = TableName;
  8. }
  9. public string GetTableName()
  10. {
  11. return this._TableName;
  12. }
  13. }
  1. [AttributeUsage(AttributeTargets.Property)]
  2. public class ColumnAttribute:Attribute
  3. {
  4. private string _ColumnName = "";
  5. public ColumnAttribute(string ColumnName)
  6. {
  7. this._ColumnName = ColumnName;
  8. }
  9. public string GetColumnName()
  10. {
  11. return this._ColumnName;
  12. }
  13. }

再做一个静态扩展类,增加2个扩展方法 一个针对类型的、一个针对属性的扩展方法

  1. public static class AttributeExtend
  2. {
  3. public static string GetMappingName<T>(this T t) where T : BaseModel
  4. {
  5. if (t.GetType().IsDefined(typeof(TableAttribute), true))
  6. {
  7. TableAttribute attribute = (TableAttribute)t.GetType().GetCustomAttributes(typeof(TableAttribute), true)[];
  8. return attribute.GetTableName();
  9. }
  10. else
  11. {
  12. return t.GetType().Name;
  13. }
  14. }
  15.  
  16. public static string GetMappingName(this PropertyInfo prop)
  17. {
  18. if (prop.IsDefined(typeof(ColumnAttribute), true))
  19. {
  20. ColumnAttribute attribute = (ColumnAttribute)prop.GetCustomAttribute(typeof(ColumnAttribute), true);
  21. return attribute.GetColumnName();
  22. }
  23. else
  24. {
  25. return prop.Name;
  26. }
  27. }
  28.  
  29. public static string GetMappingName(this Type type)
  30. {
  31. if (type.IsDefined(typeof(TableAttribute), true))
  32. {
  33. TableAttribute attribute = (TableAttribute)type.GetCustomAttribute(typeof(TableAttribute), true);
  34. return attribute.GetTableName();
  35. }
  36. else
  37. {
  38. return type.Name;
  39. }
  40. }
  41. }

获取sql语句方法,目前只简单写了查询所有的,及根据ID查询,如果想丰富查询操作需要用到表达式目录树

  1. public class OrmSql
  2. {
  3. public string GetAllSelectSQL<T>() where T :BaseModel
  4. {
  5. Type type = typeof(T);
  6. var props = type.GetProperties();
  7. string columnString = string.Join(",", props.Select(m => $"[{m.GetMappingName()}]"));
  8. string SelectSQL = $"select {columnString} from {type.GetMappingName()}";
  9. return SelectSQL;
  10. }
  11. public string GetSelectSQLByID<T>(T t) where T :BaseModel
  12. {
  13. Type type = typeof(T);
  14. var props = type.GetProperties();
  15. string columnString = string.Join(",", props.Select(m => $"[{m.GetMappingName()}]"));
  16. string SelectSQL = $"select {columnString} from {type.GetMappingName()} where id= '{t.Id}'";
  17. return SelectSQL;
  18. }
  19.  
  20. }

调用方法

  1. public class Program
  2. {
  3. public static void Main(string[] args)
  4. {
  5. OrmSql orm = new OrmSql();
  6. Console.WriteLine(orm.GetAllSelectSQL<Donator>() );
  7. Console.WriteLine(orm.GetSelectSQLByID<Donator>(new Donator() { Id=}) );
  8. }
  9. }

运行截图:

简单理解ORM,实体类生成查询SQL语句的更多相关文章

  1. EF:根据实体类生成表结构SQL

    根据实体类生成表结构SQL: PM> Enable-Migrations -ProjectName Domain -StartUpProjectName Handler -Force PM> ...

  2. 通过实体类生成建表SQL语句实现方法

    import java.io.File; import java.io.FileOutputStream; import java.lang.reflect.Field; import java.ut ...

  3. Java代码实体类生成SQL语句(Java实体类转数据库)

    有的时候把数据库删了,如果照着实体类重新创建数据库的话比较麻烦,可以使用这个工具,把代码复制到项目里面设置一下即可把Java代码中的实体类转换为SQL语句输出为一个文件,打开执行命令即可. 下载:ht ...

  4. C# T4 模板 数据库实体类生成模板(带注释,娱乐用)

     说明:..,有些工具生成实体类没注释,不能和SqlServer的MS_Description属性一起使用,然后照着网上的资源,随便写了个生成模板,自娱自乐向,其实卵用都没有参考教程    1.htt ...

  5. 利用反射跟自定义注解拼接实体对象的查询SQL

    前言 项目中虽然有ORM映射框架来帮我们拼写SQL,简化开发过程,降低开发难度.但难免会出现需要自己拼写SQL的情况,这里分享一个利用反射跟自定义注解拼接实体对象的查询SQL的方法. 代码 自定义注解 ...

  6. 【干货分享】C# 实体类生成工具

    前言: 项目实战中不论是业务编码还是通用编码,总会归纳出一些通用的工具类.放入项目中一劳永逸,让兄弟姐妹们避免编写重复代码.所以利用了工作之余的时间,将这些散落在多个项目中精致优雅的工具类,归纳起来形 ...

  7. [开源] FreeSql.AdminLTE.Tools 根据实体类生成后台管理代码

    前言 FreeSql 发布至今已经有9个月,功能渐渐完善,自身的生态也逐步形成,早在几个月前写过一篇文章<ORM 开发环境之利器:MVC 中间件 FreeSql.AdminLTE>,您可以 ...

  8. 深入理解 LINQ to SQL 生成的 SQL 语句

    Ø  简介 在 C# 中与数据交互最常用的语句就是 LINQ 了,而 LINQ to SQL 是最直接与数据库打交道的语句,它可以根据 LINQ 语法生成对应的 SQL 语句,在数据库中去执行.本文主 ...

  9. C#实体类生成XML与XML Schema文档

    一.实体类生成XML private void CreateXML() { Type[] objType = DBEntityRegst(); foreach (var item in objType ...

随机推荐

  1. fetch的常见问题及其解决办法

    摘要: 玩转fetch. 作者:wonyun 原文:fetch使用的常见问题及其解决办法 Fundebug经授权转载,版权归原作者所有. 首先声明一下,本文不是要讲解fetch的具体用法,不清楚的可以 ...

  2. Truck History POJ - 1789

    题目链接:https://vjudge.net/problem/POJ-1789 思路: 题目意思就是说,给定一些长度为7的字符串,可以把字符串抽象为一个点, 每个点之间的距离就是他们本身字符串与其他 ...

  3. 2018年蓝桥杯B组C/C++决赛题目

    自己的博客排版,自我感觉略好一点. 先放上题目. 点击查看2018年蓝桥杯B组C/C++决赛题目题解     1.换零钞 x星球的钞票的面额只有:100元,5元,2元,1元,共4种. 小明去x星旅游, ...

  4. linux基础-ssh服务

    SSH ssh 服务是实现管路服务器的一种方式: 本地管理(安装系统,故障修复),ssh 远程连接 linux 可以是实现远程连接的方式:ssh 命令 windows 可以实现远程连接方式: xshe ...

  5. 代码审计-sha()函数比较绕过

    <?php $flag = "flag"; if (isset($_GET['name']) and isset($_GET['password'])) { var_dump ...

  6. python27期day14:有参装饰器、多个装饰器装饰一个函数、递归、作业题

    1.有参装饰器:给装饰器添加一个参数.来控制装饰器的行为. @auth(参数) auth里层的函数名 = auth(参数) 被装饰的函数名 = auth里层的函数名(被装饰的函数名) 被装饰的函数名( ...

  7. (day47)jQuery

    目录 一.初识jQuery (一)jQuery介绍 (二)版本介绍 (三)jQuery对象 (四)相关网站 (五)基础语法 二.查找标签 (一)基本选择器 (1)id选择器 (2)标签选择器 (3)c ...

  8. C++17尝鲜

    https://cloud.tencent.com/developer/article/1351910 [译]C++17,optional, any, 和 variant 的更多细节 用户261520 ...

  9. Comet OJ 计算机(computer)

    Comet OJ 计算机(computer) 题目传送门 题目描述 小 X 有一台奇怪的计算机. 这台计算机首先会读入一个正整数 nn,然后生成一个包含 nn 个数的序列 aa. 一开始 a_i(1 ...

  10. leetcode 561. 数组拆分 I

    为了理解这种方法,让我们从不同的角度来看待问题.我们需要形成数组元​​素的配对,使得这种配对中最小的总和最大.因此,我们可以查看选择配对中最小值的操作,比如 (a,b)(a,b) 可能会产生的最大损失 ...