欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.net下开源轻量级ORM框架Dapper扩展系列2

程序员文章站 2022-07-08 16:35:56
在上次的扩展中,有朋友对代码和性能提出了一些批评。因此在今天扩展前我先说明: 我遇到问题,是先解决,再谈优化,如果问题都不能解决,何来优化。所以在全部扩展完成之后,我会进行一次代...
在上次的扩展中,有朋友对代码和性能提出了一些批评。因此在今天扩展前我先说明:

我遇到问题,是先解决,再谈优化,如果问题都不能解决,何来优化。所以在全部扩展完成之后,我会进行一次代码重构和一些性能优化(当然是在自己技术能力范围内的哈)

所以暂时我们先放下代码和性能问题,先着手解决问题。

 

喜闻乐见的扩展又开始了GO

 

今天目标:查询扩展

 

想到组装条件查询语句,开始想的是定义类,用树形结构来表示每一个条件单元(意思是:括号包含的条件,例如:where (id<>''))

但是想到这样处理后,其实在编码使用上会觉得别扭(反正我不习惯),我决定要用括号时自己调用方法直接组装,这样也灵活,逻辑也不复杂。

 

查询少不了操作符,所以有了如下几个类

 

枚举:OperationMethod,定义SQL中操作符

 

 View Code

排序类:QueryOrder,用于排序处理

 

 View Code

现在,我们思考一个问题:Dapper的参数化查询是这样:

 

请注意后面的参数,是一个匿名类,如果要使用这样的查询,我们就必须对参数动态的创建类,如果动态对参数创建类,我们用emit

 

定义类:DynamicPropertyModel,此类用于保存每一个动态创建的参数的名称和类型

 

 View Code

定义动态创建类:CustomDynamicBuilder,用于动态创建参数类

 

 View Code

有了以上基础,定义类:SqlQuery,用于组装WHERE条件

 

 View Code

 基础工作完成后,接下来就写扩展方法:

 

 View Code

最后是测试方法:

 

复制代码

[TestMethod]

        public void QueryNoWhere()//无条件的查询,相当于GetAll

        {

            using (var db = CreateDbBase())

            {

                var result = db.Query<Account>();

                Console.WriteLine("查询出数据条数:" + result.Count);

            }

        }

        [TestMethod]

        public void Query()//条件查询

        {

            using (var db = CreateDbBase())

            {

                var d = SqlQuery<Account>.Builder(db).AndWhere(m => m.Age, OperationMethod.Less, 20)

                     .LeftInclude()//此表示左括号,所以后面必须有右括号与之对应

                     .AndWhere(m => m.CreateTime, OperationMethod.Greater, DateTime.Now.AddDays(-5))

                     .OrWhere(m => m.Name, OperationMethod.Contains, "张")

                     .RightInclude()//右括号

                     .Top(10)//前10条

                     .AndWhere(m => m.Age, OperationMethod.In, new List<int>() { 15 })

                     .OrderBy(m => m.Age, true);

                //WHERE Age < @para_1 AND ( CreateTime > @para_2 OR Name LIKE @para_3 ) AND Age IN @para_4 ORDER BY Age DESC

                var result = db.Query<Account>(d);

                Console.WriteLine("查询出数据条数:" + result.Count);

            }

        }