借助表达式树感受不一样的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 关于我和表达式树 其实我也没有深入了解表达式树一些内在实现的原理 ...
随机推荐
- [Swift]LeetCode445. 两数相加 II | Add Two Numbers II
You are given two non-empty linked lists representing two non-negative integers. The most significan ...
- [SQL]LeetCode595. 大的国家 | Big Countries
SQL架构 Create table If Not Exists World (name varchar(), continent varchar(), area int, population in ...
- [Swift]LeetCode767. 重构字符串 | Reorganize String
Given a string S, check if the letters can be rearranged so that two characters that are adjacent to ...
- [Swift]LeetCode903. DI 序列的有效排列 | Valid Permutations for DI Sequence
We are given S, a length n string of characters from the set {'D', 'I'}. (These letters stand for &q ...
- Mac下安装配置Python2和Python3并相互切换使用
mac os 以前没有使用过,这次使用了一把,的确还是比较不顺手的,估计从今以后,就要把平台逐渐切换到mac了.今后好的文章,专门会开一个macos专栏,专门记录macos的使用过程中的心得,体会,以 ...
- 3.MySQL(三)
索引类型 先创建表 mysql> CREATE TABLE test( -> id INT, -> username VARCHAR(16), -> city VARCHAR( ...
- Python爬虫入门教程 18-100 煎蛋网XXOO图片抓取
写在前面 很高兴我这系列的文章写道第18篇了,今天写一个爬虫爱好者特别喜欢的网站煎蛋网http://jandan.net/ooxx,这个网站其实还是有点意思的,网站很多人写了N多的教程了,各种方式的都 ...
- 深入理解Spring AOP思想
什么是AOP?AOP解决了什么问题? 在传统的开发模式中,以下层次的是非常常见的一种,业务层每一个方法都要有重复的事务代码 如何改善这个问题? AOP希望将A.B 这些分散在各个业务逻辑中的相同代码, ...
- 带着萌新看springboot源码8(spring ioc源码 完)
上一节说到实例化了所有的单实例Bean,后面还有一步遍历 12.完成容器刷新(finishRefresh();) 那个和生命周期有关的后置处理器类型是LifecycleProcessor:监听器原理我 ...
- 【ASP.NET Core快速入门】(十三)Individual authentication 模板、EF Core Migration
Individual authentication 模板 我们首先用VSCode新建一个mvc的网站,这个网站创立的时候回自动为我们创建Identuty Core以及EF Core的代码示例,我们可以 ...