借助表达式树感受不一样的CRUD
借助表达式树感受不一样的CRUD
Intro
最近有个想法,想不写 sql 语句,做一个类似于 ORM 的东西,自己解析表达式树,生成要执行的 sql 语句,最后再执行 sql 语句,返回相应结果。
思路解析
常用的 sql 语句基本都有一定的模式,就是 INSERT
/DELETE
/Update
/SELECT
,我把公用的部分给抽离出来,把查询/更新/删除条件和指定字段通过表达式树来指出,解析传入的表达式树对象来获取条件以及要更新的字段。
源码
源码链接
Sample
请看使用示例:
安装 nuget 包 WihanLi.Common
public static class RepositoryTest
{
public static void MainTest()
{
var connectionPool = new DbConnectionPool(new DbConnectionPoolPolicy(ConfigurationHelper.ConnectionString("TestDb")));
var repo = new Repository<TestEntity>(() => connectionPool.Get());
repo.Insert(new TestEntity
{
Token = "1233",
CreatedTime = DateTime.UtcNow
});
var entity = repo.Fetch(t => t.PKID == 1);
System.Console.WriteLine(entity.Token);
repo.Update(t => t.PKID == 1, t => t.Token, 1);
entity = repo.Fetch(t => t.PKID == 1);
System.Console.WriteLine(entity.Token);
repo.Delete(t => t.PKID == 1);
entity = repo.Fetch(t => t.PKID == 1);
System.Console.WriteLine($"delete operation {(entity == null ? "Success" : "Failed")}");
repo.Execute("TRUNCATE TABLE dbo.tabTestEntity");
Console.WriteLine("finished.");
}
public class DbConnectionPool : DefaultObjectPool<DbConnection>
{
public DbConnectionPool(IPooledObjectPolicy<DbConnection> policy) : base(policy)
{
}
public DbConnectionPool(IPooledObjectPolicy<DbConnection> policy, int maximumRetained) : base(policy, maximumRetained)
{
}
}
public class DbConnectionPoolPolicy : IPooledObjectPolicy<DbConnection>
{
private readonly string _connString;
public DbConnectionPoolPolicy(string connString)
{
_connString = connString;
}
public DbConnection Create()
{
return new SqlConnection(_connString);
}
public bool Return(DbConnection obj)
{
return obj.ConnectionString.IsNotNullOrWhiteSpace();
}
}
[Table("tabTestEntity")]
internal class TestEntity
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int PKID { get; set; }
public string Token { get; set; }
public DateTime CreatedTime { get; set; }
}
}
示例使用了 ObjectPool 实现了一个数据库连接池,Repository
实例化需要一个获取 DbConnection 对象的委托,而数据库连接就是从这数据库连接池中获取。
不足/TODO
- 支持指数化查询,现在是将条件直接拼接成了字符串,做了防注入处理,要改成使用参数化查询
- 支持更多的方法解析成对应的 Sql 语句
借助表达式树感受不一样的CRUD的更多相关文章
- C#中的Lambda表达式和表达式树
在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...
- 说说lambda表达式与表达式树(未完)
Lambda表达式可以转换成为代码(委托)或者数据(表达式树).若将其赋值给委托,则Lambda表达式将转换为IL代码:如果赋值给 Expression<TDelegate>,则构造出一颗 ...
- 再讲IQueryable<T>,揭开表达式树的神秘面纱
接上篇<先说IEnumerable,我们每天用的foreach你真的懂它吗?> 最近园子里定制自己的orm那是一个风生水起,感觉不整个自己的orm都不好意思继续混博客园了(开个玩笑).那么 ...
- [C#] C# 知识回顾 - 表达式树 Expression Trees
C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...
- 轻量级表达式树解析框架Faller
有话说 之前我写了3篇关于表达式树解析的文章 干货!表达式树解析"框架"(1) 干货!表达式树解析"框架"(2) 干货!表达式树解析"框架" ...
- 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五 ...
- LinqToDB 源码分析——处理表达式树
处理表达式树可以说是所有要实现Linq To SQL的重点,同时他也是难点.笔者看完作者在LinqToDB框架里面对于这一部分的设计之后,心里有一点不知所然.由于很多代码没有文字注解.所以笔者只能接合 ...
- LinqToDB 源码分析——生成表达式树
当我们知道了Linq查询要用到的数据库信息之后.接下就是生成对应的表达式树.在前面的章节里面笔者就已经介绍过.生成表达式树是事实离不开IQueryable<T>接口.而处理表达式树离不开I ...
- 干货!表达式树解析"框架"(1)
最新设计请移步 轻量级表达式树解析框架Faller http://www.cnblogs.com/blqw/p/Faller.html 关于我和表达式树 其实我也没有深入了解表达式树一些内在实现的原理 ...
随机推荐
- SUSE12Sp3-.NET Core 2.2.1 runtime安装
1.安装libicu依赖 1.在线安装 sudo mkdir /usr/local/dotnet #创建目录 cd /usr/local/dotnet sudo wget https://downlo ...
- [Swift]LeetCode318. 最大单词长度乘积 | Maximum Product of Word Lengths
Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the tw ...
- [Swift]LeetCode910. 最小差值 II | Smallest Range II
Given an array A of integers, for each integer A[i] we need to choose either x = -K or x = K, and ad ...
- 如何让div内的多行文本上下左右居中
1.首先,如果div中的文本特别少,不超过div宽度,那么这种就非常简单了,直接line-height等于height就可以了 <style type="text/css"& ...
- PHP分页倒序时,需要注意的问题
PHP分页倒序请求,如果有新数据加入,下一页会出现重复数据 解决方案: 第一次查询时,给前端返回一个查询时间戳,下一次请求时,把时间戳带过来,只查询比这个时间戳小的数据
- 把路由器改装成git服务器(OpenWRT环境的GIT服务器搭建)
在单位中,通常都标配了git服务器用来管理代码. 对于家庭或者小办公室,这种方式有点不经济.当然如果是开源项目就简单了,刚刚被微软收购的github是理想选择.但如果没有打算开源,我今天的话题可能对你 ...
- java基础4:深入理解final关键字
本文主要介绍了final关键字的使用方法及原理 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech 文章首发于我的个人博客: https://h2pl. ...
- Chapter 4 Invitations——27
"Myself, obviously." He enunciated every syllable, as if he were talking to someone mental ...
- mtools-你可能没用过的mongodb神器
前言 接触 mongodb 已经有一段时间了,从一开始的不了解,到现在已慢慢适应这个nosql领域的佼佼者,还是经历了不少波折. 在进行数据库选型的时候,许多人总是喜欢拿 mongodb和mysql. ...
- [八]JavaIO之FileInputStream 与 FileOutputStream
接下来介绍 FileInputStream 和 FileOutputStream 现在看名字应该可以看得出来: 他就是从一个文件中读取数据 或者将数据写入到一个文件中 FileInputStream ...