简单理解ORM,实体类生成查询SQL语句
目前有很多开源的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语句的更多相关文章
- EF:根据实体类生成表结构SQL
根据实体类生成表结构SQL: PM> Enable-Migrations -ProjectName Domain -StartUpProjectName Handler -Force PM> ...
- 通过实体类生成建表SQL语句实现方法
import java.io.File; import java.io.FileOutputStream; import java.lang.reflect.Field; import java.ut ...
- Java代码实体类生成SQL语句(Java实体类转数据库)
有的时候把数据库删了,如果照着实体类重新创建数据库的话比较麻烦,可以使用这个工具,把代码复制到项目里面设置一下即可把Java代码中的实体类转换为SQL语句输出为一个文件,打开执行命令即可. 下载:ht ...
- C# T4 模板 数据库实体类生成模板(带注释,娱乐用)
说明:..,有些工具生成实体类没注释,不能和SqlServer的MS_Description属性一起使用,然后照着网上的资源,随便写了个生成模板,自娱自乐向,其实卵用都没有参考教程 1.htt ...
- 利用反射跟自定义注解拼接实体对象的查询SQL
前言 项目中虽然有ORM映射框架来帮我们拼写SQL,简化开发过程,降低开发难度.但难免会出现需要自己拼写SQL的情况,这里分享一个利用反射跟自定义注解拼接实体对象的查询SQL的方法. 代码 自定义注解 ...
- 【干货分享】C# 实体类生成工具
前言: 项目实战中不论是业务编码还是通用编码,总会归纳出一些通用的工具类.放入项目中一劳永逸,让兄弟姐妹们避免编写重复代码.所以利用了工作之余的时间,将这些散落在多个项目中精致优雅的工具类,归纳起来形 ...
- [开源] FreeSql.AdminLTE.Tools 根据实体类生成后台管理代码
前言 FreeSql 发布至今已经有9个月,功能渐渐完善,自身的生态也逐步形成,早在几个月前写过一篇文章<ORM 开发环境之利器:MVC 中间件 FreeSql.AdminLTE>,您可以 ...
- 深入理解 LINQ to SQL 生成的 SQL 语句
Ø 简介 在 C# 中与数据交互最常用的语句就是 LINQ 了,而 LINQ to SQL 是最直接与数据库打交道的语句,它可以根据 LINQ 语法生成对应的 SQL 语句,在数据库中去执行.本文主 ...
- C#实体类生成XML与XML Schema文档
一.实体类生成XML private void CreateXML() { Type[] objType = DBEntityRegst(); foreach (var item in objType ...
随机推荐
- vm|vmware workstation 15|14 pro 激活|密钥|序列号|许可证
VMware Workstation Pro 15 激活许可证 UY758-0RXEQ-M81WP-8ZM7Z-Y3HDA VF750-4MX5Q-488DQ-9WZE9-ZY2D6 UU54R-FV ...
- VS调试
1.调试输出变量值 F9先设置断点,开始调试后,依次选择调试——>窗口——>局部变量和监视——>监视1. 点击“全部中断”——>之后局部变量会显示相关变量值,监视1可以查看变量 ...
- 201871010128-杨丽霞《面向对象程序设计(java)》第十四周学习总结
201871010128-杨丽霞<面向对象程序设计(java)>第十四周学习总结(1分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-dai ...
- Python27期:错误宝典
错误信息1:SyntaxError:invalid syntax--无效语法 解决办法:变量名不能使用关键字如下图: 错误信息2:TypeError:'str' object is not calla ...
- 史上最全的CSP-J/S 第一轮知识点
CSP-J/S 第一轮知识点选讲 \(NOIP\)(全国青少年信息学奥林匹克竞赛)于2019年取消.取而代之的是由\(CCF\)推出的非专业级软件能力认证,也就是现在的\(CSP-J/S\).作为一名 ...
- JDOJ 2254 Who am I?
JDOJ 2254: Who am I? Description 输出程序自己本身的源代码. Input 无 Output 输出程序自己本身的源代码. 我真是搞不懂了出这道题还把它归到程序语法基础题里 ...
- 每天一道Rust-LeetCode(2019-06-04)
每天一道Rust-LeetCode(2019-06-04) 最长回文子串 坚持每天一道题,刷题学习Rust. 原题 题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度 ...
- C++面向对象程序设计学习笔记(2)
C++在非面向对象方面的扩充 C++向下兼容C语言,因此C语言中的语法在C++中依然成立 输入输出 C++添加了标准输入流对象cin和标准输出流对象cout来进行输入输出, 例: #include&l ...
- 【BZOJ3529】[SDOI2014] 数表(莫比乌斯反演)
点此看题面 大致题意: 规定一个\(n*m\)数表中每个数为\(\sum_{d|i,d|j}d\),求数表中不大于\(a\)的数之和. 不考虑限制 我们先不考虑限制,来推一波式子. 首先,易知数表中第 ...
- Python数据分析与爬虫
数据分析重要步骤: 1.数据获取 可以进行人工收集获取部分重要数据 可以在各个数据库中导出数据 使用Python的爬虫等技术 2.数据整理 从数据库.文件中提取数据,生成DataFrame对象 采 ...