使用操作符重载,生成ORM实体类的SQL条件语句

2019-11-28 作者:金沙澳门官网网址   |   浏览(186)

q.Select().Where(cmpResult2);

直白看上边包车型大巴代码,功效跟下面的事例相像:

从性质上来讲,这种艺术功能稍高,因为它是函数式的管理格局,更直接。

 

     /// <summary>
        /// 设置等于有个别实体性质的比较规范
        /// </summary>
        /// <param name="compare">当前实体相比较对象</param>
        /// <param name="Value">要比较的值</param>
        /// <returns>构造的实业比较对象</returns>
        public static OQLCompare operator ==(OQLCompare compare, object Value)
        {
            return BuildOperator(compare, Value, " = ");
使用操作符重载,生成ORM实体类的SQL条件语句。        }

在PDF.NET框架的ORM组件中,有壹个特意管理标准的靶子OQLCompare ,它正是基于“结缘形式”设计的,大家来寻访怎么由它来组织那个查询条件:

在OQL中,采取了看似SQL的语法,也是

               ( cmp2.Property(p.FundCode) == "KF008"| cmp2.Property(p.BankCode) == "008");

        /// <summary>
        /// 设置不对等有个别实体性质的相比基准
        /// </summary>
        /// <param name="compare">当前实体比较对象</param>
使用操作符重载,生成ORM实体类的SQL条件语句。        /// <param name="Value">要比较的值</param>
        /// <returns>构造的实业相比对象</returns>
        public static OQLCompare operator !=(OQLCompare compare, object Value)
        {
            return BuildOperator(compare, Value, " <> ");
        }

 

使用操作符重载,生成ORM实体类的SQL条件语句。 

 

1:[CityCode]=@CP1 OR [BankCode]使用操作符重载,生成ORM实体类的SQL条件语句。=@CP2;

OQLCompare cmp = new OQLCompare(p);
OQLCompare cmpResult = (cmp.Comparer(p.CityCode, OQLCompare.CompareType.Equal, "021")
                | cmp.Comparer(p.BankCode, OQLCompare.CompareType.Equal, "008"))
                & (cmp.Comparer(p.FundCode, OQLCompare.CompareType.Equal, "KF008")
                | cmp.Comparer(p.BankCode, OQLCompare.CompareType.Equal, "008"));            

而标准1实在就是 Condition1 OR Condition2,那又是三个标准构成。

        private static OQLCompare BuildOperator(OQLCompare compare, object Value,string operatorString)
        {
            string paraName = compare.GetNewParameterName();
            compare.CompareString += operatorString + paraName;
            compare.compareValueList.Add(paraName.Substring(1), Value);
使用操作符重载,生成ORM实体类的SQL条件语句。            return compare;
        }


其中[规范化表明式]就足以应用OQLCompare对象来协会。由于OQLCompare对象Comparer函数重回的依旧是一个OQLCompare对象,所以能够选取这些特点,选拔组合格局,布局出极其复杂的SQL条件语句。

Console.WriteLine("SQL=" + q.ToString());

其风华正茂纷纷的询问条件由多个O凯雷德子条件最终组合成二个AND 条件的,因而它有3组条件:

 

 

笔者们发掘,固然SQL的口径语句恐怕很复杂,但那些标准却是由一些子规范化组合成的,只怕说由大器晚成组条件组合成叁个新的规范,大家动脑,那是否卓越的“重新整合形式”阿?

 

 

我们得以应用相像的办法,继续完结 >=,>,<=,< 等SQL条件比较符号的重载,这里就不风姿浪漫一比方了,我们来看新的施用格局:

 

 

               ( cmp2.Property(p.CityCode) == "021"  | cmp2.Property(p.BankCode) == "008")
               &  

节前送礼:PDF.NET(PWMIS数据开荒框架卡塔 尔(阿拉伯语:قطر‎V3.0版开源

 

//对象 p 为实体类
OQLCompare cmp2 = new OQLCompare(p);
OQLCompare cmpResult2 = 
               ( cmp2.Equal(p.CityCode,"021")    | cmp2.Equal(p.BankCode,"008")  )
               &  
               ( cmp2.Equal(p.FundCode,"KF008")  | cmp2.Equal(p.BankCode,"008")  );

2,选取SQL相比较符号的重载:

Console.WriteLine("操作符重载 SQL=" + q.ToString());

 

q.Select().Where(cmpResult);

3:1 AND 2 ;

2:[FundCode]=@CP3 OR [BankCode]=@CP4;

q.ReSet();//重新开头化OQL

q.Select().Where(cmpResult2);

 

1,采用AND,OR重载:

 

FundReviews p = new FundReviews();//实例化二个实体类
OQL q = new OQL(p);               //实例化几个OQL对象
Console.WriteLine("OQLCompare 复杂相比原则表明式测量试验---------");

Select([属性列表]).Where([规格表明式]).OrderBy([排序字段]).GroupBy([分组字段]) 

//对象 p 为实体类
OQLCompare cmp2 = new OQLCompare(p);
OQLCompare cmpResult2 = 

Console.WriteLine("操作符重载 SQL=" + q.ToString());

注:本文介绍的那几个OQL性情仅在PDF.NET Ver 4.3版本受支持,但从前的版本参照本文说的办法加以改善,也得以行使。有关PDF.NET的版本音讯,请看官方网址介绍:

至于PDF.NET的开源新闻,请参见小编的博客随笔:

     /// <summary>
        /// 遵照实体对象的质量,获取新的标准化比较对象
        /// </summary>
        /// <param name="field"></param>
        /// <returns></returns>
        public OQLCompare Property(object field)
        {
            OQLCompare cmp = new OQLCompare();
            cmp.CompareString = this.currPropName ;
            return cmp;
        }

ORM框架的一个必不可缺的效应正是依照实体类,生成操作数据库的SQL语句,那当中,最难管理的正是这多少个复杂的SQL条件比较语句。举例,有下边那样三个SQL语句:

现行反革命这一个SQL条件的组织进度是或不是显明多了?那正是操作符重载的魅力:卡塔 尔(英语:State of Qatar)

 

3,使用Equal方法,简化相等相比较

我们看看OQL选择了雷同函数式的语法风格,但在[条件表明式]的组织进度中,依旧显得很冗长,我们得以继续对OQLCompare对象进行重构:

 

 

 

SELECT [id],[BankCode],[CityCode],[FundCode],[FundName],[FundReviews],[EndDagte],[addDate]
 FROM [FundReviews]
    WHERE  ( 
             ([CityCode]=@CP1 OR [BankCode]=@CP2)  
        AND  ([FundCode]=@CP3 OR [BankCode]=@CP4) 
           )

q.ReSet();//重新先河化OQL

本文由金沙澳门官网网址发布于金沙澳门官网网址,转载请注明出处:使用操作符重载,生成ORM实体类的SQL条件语句

关键词: