借助表达式树感受不一样的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]LeetCode68. 文本左右对齐 | Text Justification
Given an array of words and a width maxWidth, format the text such that each line has exactly maxWid ...
- 小程序webview实践
小程序webview实践 -- 张所勇 大家好,我是转转开放业务部前端负责人张所勇,今天主要来跟大家分享小程序webview方面的问题,但我并不会讲小程序的webview原理,而我主要想讲的是小程序内 ...
- webstorm 支持vue element-ui 语法高亮属性自动补全
如果webstorm中 提示 Unknown html tag el-*** 说明没有加载 node_modules 下的 element-ui 解决办法就是: 在webstorm 打开的状态下 第一 ...
- beoplay(BO)耳机拒绝配对的解决方法
最近买了个beoplay h4,但是在换了手机之后怎么也不能配对,问客服也不知道,后来找了好久才找到答案: 按住音量+ 和 音量- 指示灯出现蓝色并闪烁时,手机搜索蓝牙就可以连接了
- dataframe的select传入不定参数
在提取 dataframe 里面的列时,需要传入不定参数,即 dataframe.select(args) .例如某个 dataframe 如下: 一般提取某列或者某几列的时候是这样子写的: data ...
- WebSocket(3)---实现一对一聊天功能
实现一对一聊天功能 功能介绍:实现A和B单独聊天功能,即A发消息给B只能B接收,同样B向A发消息只能A接收. 本篇博客是在上一遍基础上搭建,上一篇博客地址:[WebSocket]---实现游戏公告功能 ...
- OO(object oriented面向对象)
面向对象OO = 面向对象的分析OOA + 面向对象的设计OOD + 面向对象的编程OOP 一.OO - Object-Oriented(面向对象) 对象代表真实或抽象的事物,有一个名字(唯一标识), ...
- MacPro4,1升级到MacPro5,1
收了一台老MacPro,2009年版本,准确型号是"MacPro4,1".机器很好,美中不足的是,太老了.硬件还好说,很多部件都可以单独采购升级,特别是有了淘宝,几乎只要有的东西, ...
- 服务测试碰钉子Server GC
如果发现你的dotnet core服务并发上不去,但cpu资源还比较充足那就要注意了!因为这很有可能是你没有设置一个运行项导致...,下面要提到的就是GC.Server这玩意,实际上项目编译中并没有这 ...
- Chapter 5 Blood Type——6
"Yes — giving up trying to be good. I'm just going to do what I want now, and let the chips fal ...