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 ,當你寫另外一個數據庫支持的時候就會發現你的重復代碼很多,就會想起我們親愛的"面向對象"了.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM