美文网首页
借助表达式树感受不一样的CRUD

借助表达式树感受不一样的CRUD

作者: 天天向上卡索 | 来源:发表于2019-01-06 17:38 被阅读57次

借助表达式树感受不一样的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

    借助表达式树感受不一样的CRUD Intro 最近有个想法,想不写 sql 语句,做一个类似于 ORM 的东西,自...

  • [二叉树] 表达式树

    将中缀表达式转换成表达式树 最快捷的方法是先找到表达式树的根元素, 以下面的这个中缀表达式为例 为了找到表达式树的...

  • 表达式树

    表达式树中缀表达式转换为后缀表达式后缀表达式总结

  • C# 表达式树及其应用 (Expression 类)

    目的:什么是表达式树?表达式能用来做什么? 一、什么是表达式树 官方解释:中文: 提供一种基类,表示表达式树节点的...

  • 构建表达式树使用后缀表达式构建

  • 【数据结构学习】关于HashMap的那些事儿

    涉及数据结构 红黑树 链表 哈希 从CRUD说起 预热知识:DEFAULT_INITIAL_CAPACITY = ...

  • Spring AOP 切点指示器

    Spring AOP借助AspectJ的切点表达式语言来定义Spring切面,下面是切点表达式中使用的指示器: e...

  • 表达式树

    表达式树基础知识 表达式树是一类树,基本结构是所有的叶节点为操作树,非叶节点为操作符。如下图所示:

  • 数据库的增删改查

    数据库的CRUD:数据库的增删改查 表的CRUD 表记录的CRUD 一、数据库的CRUD 1.增 关键词: CRE...

  • ef core中对缓存并发写的处理(部分)

    结论: 加锁 如何加锁? ef core 为了性能, 需要缓存大量的表达式树(Expression) 和 表达式...

网友评论

      本文标题:借助表达式树感受不一样的CRUD

      本文链接:https://www.haomeiwen.com/subject/iaisrqtx.html