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

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

    [AttributeUsage(AttributeTargets.Class)]
public class TableAttribute : Attribute
{
private string _TableName = "";
public TableAttribute(string TableName)
{
this._TableName = TableName;
}
public string GetTableName()
{
return this._TableName;
}
}
   [AttributeUsage(AttributeTargets.Property)]
public class ColumnAttribute:Attribute
{
private string _ColumnName = "";
public ColumnAttribute(string ColumnName)
{
this._ColumnName = ColumnName;
}
public string GetColumnName()
{
return this._ColumnName;
}
}

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

public static class AttributeExtend
{
public static string GetMappingName<T>(this T t) where T : BaseModel
{
if (t.GetType().IsDefined(typeof(TableAttribute), true))
{
TableAttribute attribute = (TableAttribute)t.GetType().GetCustomAttributes(typeof(TableAttribute), true)[];
return attribute.GetTableName();
}
else
{
return t.GetType().Name;
}
} public static string GetMappingName(this PropertyInfo prop)
{
if (prop.IsDefined(typeof(ColumnAttribute), true))
{
ColumnAttribute attribute = (ColumnAttribute)prop.GetCustomAttribute(typeof(ColumnAttribute), true);
return attribute.GetColumnName();
}
else
{
return prop.Name;
}
} public static string GetMappingName(this Type type)
{
if (type.IsDefined(typeof(TableAttribute), true))
{
TableAttribute attribute = (TableAttribute)type.GetCustomAttribute(typeof(TableAttribute), true);
return attribute.GetTableName();
}
else
{
return type.Name;
}
}
}

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

  public class OrmSql
{
public string GetAllSelectSQL<T>() where T :BaseModel
{
Type type = typeof(T);
var props = type.GetProperties();
string columnString = string.Join(",", props.Select(m => $"[{m.GetMappingName()}]"));
string SelectSQL = $"select {columnString} from {type.GetMappingName()}";
return SelectSQL;
}
public string GetSelectSQLByID<T>(T t) where T :BaseModel
{
Type type = typeof(T);
var props = type.GetProperties();
string columnString = string.Join(",", props.Select(m => $"[{m.GetMappingName()}]"));
string SelectSQL = $"select {columnString} from {type.GetMappingName()} where id= '{t.Id}'";
return SelectSQL;
} }

调用方法

 public class Program
{
public static void Main(string[] args)
{
OrmSql orm = new OrmSql();
Console.WriteLine(orm.GetAllSelectSQL<Donator>() );
Console.WriteLine(orm.GetSelectSQLByID<Donator>(new Donator() { Id=}) );
}
}

运行截图:

简单理解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. 史上最全的Spring Boot Cache使用与整合

    一:Spring缓存抽象# Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接 ...

  2. idea把菜单栏给点没了...(File、Edit、View、Navigate.......)

    第一种方法 找到idea的C盘的配置文件ui.lnf.xml文件 第二种方法 如果是高版本idea,我的是2019.3,双击shift选择Actions,搜索menu 然后重启idea

  3. VC 静态库与动态库(二)静态库创建与使用

    1.新建项目,创建项目和解决方案 StaticLibrary  这是静态库项目 G:\C++Learn\Library  Library文件夹用于存放库相关文件,包含静态库与后面的动态库工程和解决方案 ...

  4. Leetcode练习

    1. 两数相加 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这 ...

  5. Wireshark的简单使用

    TCP包 先看一下Wireshark抓到的TCP的包对应的协议层: Frame:对应是物理层,主要是传输bit流. Ethernet:数据链路层,传输数据帧,二层通信主要是通过mac地址. Inter ...

  6. 快速调用Android虚拟机

    由于使用Android studio开发flutter 每次打开软件都需要很长时间,所以我自己使用vscode进行开发,没有虚拟机也开发不了,于是就有了这篇博客的作用啦 在本地桌面新建一个xxx.ba ...

  7. C++对象布局

    <C++应用程序性能优化><深度探索C++对象模型>笔记 #include<iostream> using namespace std; class student ...

  8. Educational Codeforces Round 61 (Rated for Div. 2) E 多重背包优化

    https://codeforces.com/contest/1132/problem/E 题意 有8种物品,重量是1~8,每种数量是\(cnt[i]\)(1e16),问容量为W(1e18)的背包最多 ...

  9. pymongo方法详解

    1.连接mongodb ######### 方法一 ########## import pymongo # MongoClient()返回一个mongodb的连接对象client client = p ...

  10. DingTalk钉钉消息推送(.net core 3 WebApi尝鲜记)

    我发了个朋友圈,Swagger真他妈的牛B,解放了开发API的码农,麻麻再也不用担心我们写API文档耽误回家吃饭了. /// <summary> /// 发送钉钉消息 /// </s ...