VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • C#教程之借助表达式树感受不一样的CRUD

Intro#

最近有个想法,想不写 sql 语句,做一个类似于 ORM 的东西,自己解析表达式树,生成要执行的 sql 语句,最后再执行 sql 语句,返回相应结果。

思路解析#

常用的 sql 语句基本都有一定的模式,就是 INSERT/DELETE/Update/SELECT,我把公用的部分给抽离出来,把查询/更新/删除条件和指定字段通过表达式树来指出,解析传入的表达式树对象来获取条件以及要更新的字段。

源码#

源码链接

  • Repository

  • 表达式树解析

Sample#

请看使用示例:

安装 nuget 包 WihanLi.Common


	
Copy
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#

  • 支持通过 Column 自定义列名称
  • 支持指数化查询,现在是将条件直接拼接成了字符串,做了防注入处理,要改成使用参数化查询
  • 支持更多的方法解析成对应的 Sql 语句
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

相关教程