当前位置: 移动技术网 > IT编程>开发语言>.net > .net下开源轻量级ORM框架Dapper扩展系列2

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

2018年03月13日  | 移动技术网IT编程  | 我要评论

赵本山宋祖英,赵世熙19禁,荆州

在上次的扩展中,有朋友对代码和性能提出了一些批评。因此在今天扩展前我先说明:

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

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

 

喜闻乐见的扩展又开始了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);

            }

        }

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网