c# 轻量级ORM框架 之 WhereHelper (二)

上篇文章发布了一些设计orm框架基层的和实现,有朋友提出WhereHelper是亮点,能被认可我表示高兴.

我就把WhereHelper设计思想和代码公开下.

WhereHelper 的概念就是再拼接where 条件,为了能兼容各种数据库和参数化查询,故封装了该对象.

首先根据我的框架结构:

  1.Common库

    这里主要定义了,所有层都访问的类型及常用方法,因为是介绍WhereHelper的实现,对其它就不做详细解释了.

WhereHelper定义到这一层是想着UI会用到该查询,故把该类型的定义放到Common里

  2.DataAccess

    该层是操作数据库的一些方法封装.

在Common里的WhereHelper它是抽象的(其实完全可以是接口),且构造函数为

WhereHelper的实现类均放在DataAccess里,而且它的实现类构造函数都为 internal ,这个是为了实现只有我的Dal具体类(SQLDalBase,OracleDalBase,等等)知道它应该创建什么类型的具体WhereHelper对象,其实在DalBase里定义了WHereHelper的工厂.

不能让调用者直接创建.否则整个系统改变数据库时,就意味着要改变它创建的具体对象.

以下是WHereHelper的代码具体实现

public abstract class WhereHelper
    {
        #region 构造函数

        protected WhereHelper()
        {
            _WhereText = new StringBuilder();
            _ParamDict = new Dictionary<string, object>();
        }
        protected WhereHelper(string paramNameKey)
            : this()
        {
            _ParamNameKey = paramNameKey;
        }
        protected WhereHelper(WhereHelper wh)
            : this()
        {
            this._LastParamIndex = wh._LastParamIndex;
            this._ParamDict = wh._ParamDict;
            this._WhereText = wh._WhereText;
            this._ParamNameKey = wh._ParamNameKey;
        }

        #endregion

        #region 重写ToString

        public override string ToString()
        {
            return _WhereText.ToString();
        }

        #endregion

        #region 字段

        string _ParamNameKey;
        StringBuilder _WhereText;
        Dictionary<string, object> _ParamDict;
        int _LastParamIndex = -1;

        #endregion

        #region 属性

        /// <summary>
        /// 返回当前对象所有产品参数集合字典,key:参数数名(包含@),value:参数值
        /// </summary>
        public Dictionary<string, object> ParamDict
        {
            get
            {
                return _ParamDict;
            }
        }
        /// <summary>
        /// 返回当前生成where文本
        /// </summary>
        public StringBuilder WhereText
        {
            get
            {
                return _WhereText;
            }
        }

        #endregion

        #region 外部方法

        /// <summary>
        /// 增加查询参数,并输出参数名,参数名会根据LastParamIndex递增
        /// </summary>
        /// <param name="v">参数值</param>
        /// <returns>返回参数名</returns>
        protected string AddParam(object v)
        {
            _LastParamIndex++;
            string paramName = string.Format("@P_{1}{0}", _LastParamIndex, _ParamNameKey);
            _ParamDict.Add(paramName, v);
            return paramName;
        }
        /// <summary>
        /// 清除文本内容和参数内容
        /// </summary>
        public void Clear()
        {
            _ParamDict.Clear();
            _WhereText.Remove(0, _WhereText.Length);
        }
        /// <summary>
        /// 当前where文本增加字符(通常该值是 字段名 ),返回当前对象
        /// </summary>
        public virtual WhereHelper Add(string str)
        {
            this._WhereText.AppendFormat(" {0} ", str);
            return this;
        }
        /// <summary>
        /// 比较符,等于 "="
        /// </summary>
        public virtual WhereHelper Equal(object v)
        {
            this._WhereText.AppendFormat(" = {0}", AddParam(v));
            return this;
        }
        /// <summary>
        /// 比较符,不等于 "!="
        /// </summary>
        public virtual WhereHelper EqualNot(object v)
        {
            _WhereText.AppendFormat(" <> {0}", AddParam(v));
            return this;
        }
        /// <summary>
        /// 比较符,大于 ">"
        /// </summary>
        public virtual WhereHelper GreaterThan(object v)
        {
            this._WhereText.AppendFormat(" > {0}", AddParam(v));
            return this;
        }
        /// <summary>
        /// 比较符,小于
        /// </summary>
        public virtual WhereHelper LessThan(object v)
        {
            this._WhereText.AppendFormat(" < {0}", this.AddParam(v));
            return this;
        }
        /// <summary>
        /// 比较符,大于等于
        /// </summary>
        public virtual WhereHelper GreaterThenEqual(object v)
        {
            this._WhereText.AppendFormat(" >= {0}", this.AddParam(v));
            return this;
        }
        /// <summary>
        /// 比较符,小于等于
        /// </summary>
        public virtual WhereHelper LessThanEqual(object v)
        {
            this._WhereText.AppendFormat(" <= {0}", this.AddParam(v));
            return this;
        }
        /// <summary>
        /// 比较符,In,参数为某范围内的比较值
        /// </summary>
        public virtual WhereHelper In(params object[] inArgs)
        {
            this._WhereText.Append(" in (");
            for (int i = 0; i < inArgs.Length; i++)
            {
                _WhereText.Append(AddParam(inArgs[i]));
                if (i < inArgs.Length - 1)
                {
                    _WhereText.Append(",");
                }
            }
            this._WhereText.Append(" )");
            return this;
        }
        /// <summary>
        /// 比较符,NotIn
        /// </summary>
        public virtual WhereHelper NotIn(params object[] inArgs)
        {
            this._WhereText.Append(" not in (");
            for (int i = 0; i < inArgs.Length; i++)
            {
                _WhereText.Append(AddParam(inArgs[i]));
                if (i < inArgs.Length - 1)
                {
                    _WhereText.Append(",");
                }
            }
            this._WhereText.Append(" )");
            return this;
        }
        /// <summary>
        /// 比较符 left Like %{0}
        /// </summary>
        public virtual WhereHelper LikeLeft(string v)
        {
            string addParam = AddParam(string.Format("%{0}", v));
            this._WhereText.AppendFormat(" like {0}", addParam);
            return this;
        }
        /// <summary>
        /// 比较符 right like {0}%
        /// </summary>
        public virtual WhereHelper LikeRight(string v)
        {
            string addParam = AddParam(string.Format("{0}%", v));
            this._WhereText.AppendFormat(" like {0}", addParam);
            return this;
        }
        /// <summary>
        /// 比较符 full like
        /// </summary>
        public virtual WhereHelper LikeFull(string v)
        {
            string addParam = AddParam(string.Format("%{0}%", v));
            this._WhereText.AppendFormat(" like {0}", addParam);
            return this;
        }
        /// <summary>
        /// 增加一个左括号 "("
        /// </summary>
        public virtual WhereHelper BracketLeft()
        {
            this._WhereText.AppendFormat("(");
            return this;
        }
        /// <summary>
        /// 增加一个左括号"(",再加一个字符串(通常是一个字段)
        /// </summary>
        public virtual WhereHelper BracketLeft(string str)
        {
            this._WhereText.AppendFormat("(");
            this._WhereText.AppendFormat(str);
            return this;
        }
        /// <summary>
        /// 增加一个右括号 ")"
        /// </summary>
        public virtual WhereHelper BracketRight()
        {
            this._WhereText.Append(")");
            return this;
        }
        /// <summary>
        /// 增加连接符 "and"
        /// </summary>
        public virtual WhereHelper And()
        {
            And(string.Empty);
            return this;
        }
        /// <summary>
        /// 增加连接符 "and"
        /// </summary>
        public virtual WhereHelper And(string str)
        {
            if (this._WhereText.Length > 0)
            {
                this._WhereText.Append(" and ");
            }
            this._WhereText.Append(str);
            return this;
        }
        /// <summary>
        /// 增加连接符 "or"
        /// </summary>
        public virtual WhereHelper Or()
        {
            Or(string.Empty);
            return this;
        }
        /// <summary>
        /// 增加连接符"or",再加一个字符串(通常是一个字段)
        /// </summary>
        public virtual WhereHelper Or(string str)
        {
            if (this._WhereText.Length > 0)
            {
                this._WhereText.Append(" or ");
            }
            this._WhereText.Append(str);
            return this;
        }

        #endregion
    }

代码实现比较简单.

这个抽象类有了具体实现,如果再使用非sqlserver数据库时报错了(sql语法),那么就去DataAccess中找到它对应的具体类,去重写它的方法.

该类的所有public方法都返回了 this,也就是说,你"点"把它始终是一个对象.

拼接方式也非常灵活,可以直接拼写sql文(但不建议)它会给迁移数据库带来隐患.

至于参数的名字,只要你是一个WHereHleper对象,它是肯定不会重复的,如果你要拼接另外一个未知的WHereHelper到当前对象你可以用它的另一个构造(用到的几率很小)

举个例子吧:

  sql where条件:  姓名=‘张三‘   and 年龄 > 20 and 年龄<30 and (性别=男 or 性别=女 )

代码如下:

WhereHelper wh1 = _BllObj.CreateWhereHelper();
            wh1.Add("姓名")
               .Equal("张三")
               .And("年龄")
               .GreaterThan(20)
               .And("年龄")
               .LessThan(30)
               .And()
               .BracketLeft("性别")
               .Equal("男")
               .Or("性别")
               .BracketRight();

为了格式好看,我把它每次"点"分成了一行(这个看起来确实有点像jquery的感觉);

好了,这个实现大概先说这么多,如果有什么问题欢迎留言.

有人回复,我才有写下去的动力.

关于我的orm框架,第一篇,其实是实现的根本.

值的写出来或许还有DBHelper的实现,通常初学者都会写一个具体的如:SQL Server 数据的 SQLHelper ,当你写另外一个数据库支持的时候就会发现你的重复代码很多,就会想起我们亲爱的"面向对象"了.

c# 轻量级ORM框架 之 WhereHelper (二)

时间: 2024-10-05 16:14:23

c# 轻量级ORM框架 之 WhereHelper (二)的相关文章

c# 轻量级ORM框架 实现(一)

发布一个自己写的一个轻量级ORM框架,本框架设计期初基于三层架构.所以从命名上来看,了解三层的朋友会很好理解. 设计该框架的目的:不想重复的写增删改查,把精力放到功能实现上. 发布改框架的原因:希望给初学者一个参考,希望能给予好的建议,给自己一个展示机会. 在我开始之前,先说明一下,我对"软件工程学"概念东西几乎不通,最高文化程度:初二,所以不喜勿喷. 开始我的orm设计最底层 最底层的是一个DalBase,它是一个抽象的,实现了增删改查的基本操作. 它既然是一个抽象的,那么它的内部就

轻量级ORM框架初探-Dapper与PetaPoco的基本使用

一.EntityFramework EF是传统的ORM框架,也是一个比较重量级的ORM框架.这里仍然使用EF的原因在于为了突出轻量级ORM框架的性能,所谓有对比才有更优的选择. 1.1 准备一张数据库表 (1)For MSSQL CREATE TABLE [dbo].[Posts] ( [Id] INT NOT NULL PRIMARY KEY IDENTITY, [CategoryId] INT NOT NULL, [Slug] VARCHAR(120) NOT NULL, [Title] N

Android轻量级ORM框架ActiveAndroid入门教程(转)

注:没有找到出处,如有侵犯,请告知 开始ActiveAndroid神奇之旅: 在AndroidManifest.xml中我们需要添加这两个 AA_DB_NAME (数据库名称,这个name不能改,但是是可选的,如果不写的话 是默认的"Application.db"这个值) AA_DB_VERSION (数据库版本号,同样是可选的 – 默认为1) <manifest ...> <application android:name="com.activeandro

.NET轻量级ORM框架Dapper入门精通

一.课程介绍 本次分享课程包含两个部分<.NET轻量级ORM框架Dapper修炼手册>和<.NET轻量级ORM框架Dapper葵花宝典>,阿笨将带领大家一起领略轻量级ORM框架Dapper的魅力. 本次分享课程适合人群范围: 一.<.NET轻量级ORM框架Dapper修炼手册>适合人群如下: 1.我是一个新手,主要工作面向的是MS SQL Server数据库,那么选择修炼手册一定没错. 2.对Dapper从没有过了解或者了解不全面的同学,想通过学习进一步提升对Dappe

c# 轻量级 ORM 框架 之 DBHelper 实现 (三)

周末了比较清闲,把自己的orm框架整理了下,开源了. 已经做出来的东西通常感觉有些简单,一些新手或许听到"框架"一类的词觉得有些"高深",简单来说orm就是把ado的封装. 在介绍这个框架的第一篇博文,已经把DalBase介绍了一下设计思路,本篇的DBHelper对象也是给dalBase来用的,可以说框架的所有定义对象都是为了它. 这里起名叫DBHelper,因为我也是从写SQLHelper开始的,DBHelper只不过是所有类型对ado操作的各种方法的封装,所以本

c# 轻量级 ORM 框架 之 Model解析 (四)

关于orm框架设计,还有必要说的或许就是Model解析了,也是重要的一个环节,在实现上还是相对比较简单的. Model解析,主要用到的技术是反射了,即:把类的属性与表的字段做映射. 把自己的设计及实现思路写出来也希望能有人给很好的优化建议,同时也给新手一点启发吧. 首先先给Model属性定义特性,先普及一下"特性"的概念和为什么用特性(Attribute). 简单来说,特性是给一个类,或方法,或属性 打上一个标记(或者叫附加信息),具体理解还是看例子比较好吧, 在做类与表之间映射时,我

分享自己写的基于Dapper的轻量级ORM框架~

1.说明 本项目是一个使用.NET Standard 2.0开发的,基于 Dapper 的轻量级 ORM 框架,包含基本的CRUD以及根据表达式进行一些操作的方法,目前只针对单表,不包含多表连接操作. github:https://github.com/iamoldli/NetSql 2.使用方法 2.2.安装 Install-Package NetSql 2.2.创建实体 创建Article实体类,继承EntityBase public class Article : EntityBase {

.NET轻量级ORM框架Dapper修炼手册

一.摘要 1.1.为什么叫本次的分享课叫<修炼手册>? 阿笨希望本次的分享课中涉及覆盖的一些小技巧.小技能给您带来一些帮助.希望您在日后工作中把它作为一本实际技能手册进行储备,以备不时之需,一旦当手头遇到与Dapper修炼手册中相似用法的地方和场景,可以直接拿来进行翻阅并灵活的运用到项目中.最后阿笨建议您可以根据自己在工作中碰到的不同的使用场景,不断的完善此本修炼手册. 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工. 四.涉及覆盖的知识点 1.C# Linq To Xml技术.

轻量级ORM框架——第一篇:Dapper快速学习

我们都知道ORM全称叫做Object Relationship Mapper,也就是可以用object来map我们的db,而且市面上的orm框架有很多,其中有一个框架 叫做dapper,而且被称为the king of ORM. 一:为什么选择Dapper 1. 性能优越: 其实在各大网站上,我们大概都会看到这样的一个对比效果图,在超过500次poco serialization的过程中所表现的性能,我们发现dapper是第二名, 当然第一名谁也无法超越,越底层的当然久越快,同时也就越麻烦.就好