• Git.Framework 框架随手记--ORM条件组合


      在上一篇<Git.Framework 框架随手记--ORM新增操作>中简单记录了如何对数据进行删除和修改,其用法都非常简单,在文章中提到了Where()方法,本文将详述Where() 等条件函数。

      一. SQL 条件分析

        对于SQL每个人应该都很熟悉,这是基础的基础,如果没有使用过SQL的本文可以直接忽略了。先简单看看一个SQL语句,我们根据SQL语句的规则理解Where()方法

    SELECT [ID],[UserName],[PassWord],[UserCode],[RealName],[Email],[Mobile],[Phone],[CreateTime],[CreateIp],[CreateUser],[LoginCount],[Picture],[UpdateTime],[IsDelete],[Status],[DepartNum],[ParentCode],[RoleNum],[Remark]
    FROM [JooShowGit].[dbo].[Admin]
    WHERE [UserCode]=@UserCode AND [IsDelete]=@IsDelete OR [Phone]=@Phone

        SQL语句中后面起始条件关键字必定是WHERE,这个毋庸置疑。如果后面要跟其他的条件我们就可以使用AND 或者 OR 关键字将其连接起来。SQL条件语句基本可以归纳为如下

    SELECT * FROM TABLE WHERE [表达式] (AND|OR) [表达式] ....

        再看看一个稍微复杂点的SQL语句,代码如下

    SELECT [ID],[UserName],[PassWord],[UserCode],[RealName],[Email],[Mobile],[Phone],[CreateTime],[CreateIp],[CreateUser],[LoginCount],[Picture],[UpdateTime],[IsDelete],[Status],[DepartNum],[ParentCode],[RoleNum],[Remark]
    FROM [JooShowGit].[dbo].[Admin]
    WHERE ([UserCode]=@UserCode1 OR [UserCode]=@UserCode2) AND [IsDelete]=@IsDelete

        语句是什么意思,看官一看就能够明白,我们看重点部分 ,这个SQL语句使用了 () 运算符, 两个条件 () 和  [IsDelete]=@IsDelete 使用AND连接的,在()运算符中又是多个单个表达式的组合。

        在看看单个表达式的效果

    WHERE [UserCode]=@UserCode AND [IsDelete]=@IsDelete OR [Phone]=@Phone

        表达式可以抽象理解为  字段 [运算符] 值 这种情况。在SQL中有很多运算符,这里我们看看详细:

    +(加)、―(减)、(乘)、(除)、%(取余)>(大于)<(小于)、= (等于)、>=(大于等于)、<=(小于等于)、<> (不等于)、!=(不等于)、!>(不大于)!<( 不小于)

        当然其他的运算符(AND OR 也称作运算符),我们先做一些简单的。

        以上问题说的比较含糊,表述可能不清晰,但是大家应该都能够明白其大概意思,从以上的比较可以看出其实SQL是有一定规则的。

      二. 框架中提供的条件方法

        在做ORM映射的过程中,我们对条件操作的运算符也做了相应的映射,其映射为了一个枚举值

    public enum ECondition
        {
            /// <summary>
            /// AND
            /// </summary>
            //And =1 ,
    
            /// <summary>
            /// OR
            /// </summary>
            //Or =2 ,
    
            /// <summary>
            /// LIKE
            /// </summary>
            Like = 3,
    
            /// <summary>
            /// IN
            /// </summary>
            In = 4,
    
            /// <summary>
            /// 大于 >
            /// </summary>
            Gth = 5,
    
            /// <summary>
            /// 小于 <
            /// </summary>
            Lth = 6,
    
            /// <summary>
            /// 等于 =
            /// </summary>
            Eth = 7,
    
            /// <summary>
            /// 大于等于 >=
            /// </summary>
            Geth = 8,
    
            /// <summary>
            /// 小于等于 <=
            /// </summary>
            Leth = 9,
    
            /// <summary>
            /// 不等于 !=
            /// </summary>
            NotEth = 10,
    
            /// <summary>
            /// Is 关键字
            /// </summary>
            Is = 11,
    
            /// <summary>
            /// Is Not 关键字
            /// </summary>
            IsNot = 12,
    
            /// <summary>
            /// Between AND关键字
            /// </summary>
            Between = 13,
    
            /// <summary>
            /// OR LIKE
            /// </summary>
            OrLike = 14,
    
            /// <summary>
            /// OR IN
            /// </summary>
            OrIn = 15,
    
            /// <summary>
            ///  OR 字段>
            /// </summary>
            OrGth = 16,
    
    
            OrLth = 17,
    
            OrEth = 18,
    
            OrGeth = 19,
    
            OrLeth = 20,
    
            OrNotEth = 21,
    
            OrIs = 22,
    
            OrIsNot = 23,
    
            OrBetween = 24,
    
            /// <summary>
            /// +=
            /// </summary>
            AddEth=25,
    
            /// <summary>
            /// -=
            /// </summary>
            SubtractEth=26,
    
            /// <summary>
            /// *=
            /// </summary>
            MultiplyEth=27,
    
            /// <summary>
            /// /=
            /// </summary>
            DivideEth=28,
    
            /// <summary>
            ///  % 
            /// </summary>
            Modulo=29,
    
            /// <summary>
            /// +
            /// </summary>
            Add=30,
    
            /// <summary>
            /// -
            /// </summary>
            Subtract = 31,
    
            /// <summary>
            /// *
            /// </summary>
            Multiply = 32,
    
            /// <summary>
            /// /
            /// </summary>
            Divide=33
        }
    ECondition 运算符枚举

        其中有些枚举值有点奇怪,当时为了配合理解SQL语法,其中在对() 运算的时候采用了特殊的标记,我们会使用特定的方法来代替。

    public void Or(string propertyName, ECondition condition);
    public void Or(string propertyName, ECondition condition, params object[] values);
    public void OrBegin();public void Where(string propertyName, ECondition condition);
    public void Where(string propertyName, ECondition condition, params object[] values);
    public void WhereBegin();
    public void And(string propertyName, ECondition condition);
    public void And(string propertyName, ECondition condition, params object[] values);
    public void AndBegin();
    public void Begin();public void End();

        这个地方有点意思,我们将WHERE,AND,OR三个连接运算符映射成了相应的方法,其中更加奇怪的是有OrBegin(),WhereBegin(),AndBegin(),Begin(),End()几个方法。上面在分析SQL的时候主要到了() 运算符,这几个方法就是为了对()特殊优待,当时设计的时候为了更好的理解() ,将()分为了两部分 ,分别对应 Begin() ,End(); 也就是前 "(" 和 ")" 而其余的几个就是对其扩展 。

    WHERE ([UserCode]=@UserCode1 OR [UserCode]=@UserCode2) AND [IsDelete]=@IsDelete

        其实也就可以立即为 WhereBegin(); ANND();  OR (); END(); 这种调用就好比将写SQL的手法转化为命令模式。 很多对此不能够很好的理解,也对此嗤之以鼻,不要紧这只是理解的角度不一样而已,而且在对WHERE等方法向Lambda表达式转化的时候强制不能使用复合条件,避免Linq和EF中的太多层次的嵌套导致自己也晕了。 

        对于上面的一些方法我们还做了一些扩展,主要扩展方法如下:

    public static T And<T>(this T entity, Expression<Func<T, bool>> func) where T : BaseEntity;
    public static T And<T>(this T entity, string propertyName, ECondition condition) where T : BaseEntity;
    public static T And<T>(this T entity, string propertyName, ECondition condition, params object[] values) where T : BaseEntity;
    public static T AndBegin<T>(this T entity) where T : BaseEntity;
    public static T Begin<T>(this T entity) where T : BaseEntity;
    public static T Between<T>(this T entity, string propertyName, object[] items) where T : BaseEntity;
    public static T End<T>(this T entity) where T : BaseEntity;
    public static T Or<T>(this T entity, Expression<Func<T, bool>> func) where T : BaseEntity;
    public static T Or<T>(this T entity, string propertyName, ECondition condition) where T : BaseEntity;
    public static T Or<T>(this T entity, string propertyName, ECondition condition, params object[] values) where T : BaseEntity;
    public static T OrBegin<T>(this T entity) where T : BaseEntity;
    public static T Where<T>(this T entity, Expression<Func<T, bool>> func) where T : BaseEntity;
    public static T Where<T>(this T entity, string propertyName, ECondition condition) where T : BaseEntity;
    public static T Where<T>(this T entity, string propertyName, ECondition condition, params object[] values) where T : BaseEntity;
    public static T WhereBegin<T>(this T entity) where T : BaseEntity;

       三. 使用实例

    entity.IncludeAll();
    entity.Where(a => a.IsDelete == (int)EIsDelete.NotDelete);

        这个条件语句在之前已经解析过了,就是WHERE [IsDelete]= (int)EIsDelete.NotDelete .

    entity.IncludeAll();
    entity.Where("IsDelete", ECondition.Eth,(int)EIsDelete.NotDelete);

        上面这两段代码其实是等价的,只是后一种是使用Lambda表达式来解析的,最终的结果都一样。

    SELECT t0.[ID],t0.[UserName],t0.[PassWord],t0.[UserCode],t0.[RealName],t0.[Email],t0.[Mobile],t0.[Phone],t0.[CreateTime],t0.[CreateIp],t0.[CreateUser],t0.[LoginCount],t0.[Picture],t0.[UpdateTime],t0.[IsDelete],t0.[Status],t0.[DepartNum],t0.[ParentCode],t0.[RoleNum],t0.[Remark],t1.[RoleName] AS RoleName FROM [dbo].[Admin] AS t0  LEFT JOIN [dbo].[SysRole] AS t1 ON  t0.[RoleNum]=t1.[RoleNum]  WHERE t0.[IsDelete]=@0_t0_ISDelete

         上面的方法调用最终生成的SQL如上,我们中重点看WHERE后面的,如果对比起来应该都能够理解了

    DateTime beginTime = ConvertHelper.ToType<DateTime>(begin);
    DateTime endTime = ConvertHelper.ToType<DateTime>(end);
    entity.And<T_EXECUTEEntity>("execute_start_time", ECondition.Between, beginTime, endTime).And<T_EXECUTEEntity>("execute_end_time", ECondition.IsNot, null); ;

        


    作者:情缘
    出处:http://www.cnblogs.com/qingyuan/
    关于作者:从事仓库,生产软件方面的开发,在项目管理以及企业经营方面寻求发展之路
    版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
    联系方式: 个人QQ  821865130 ; 仓储技术QQ群 88718955,142050808 ;
    吉特仓储管理系统 开源地址: https://github.com/hechenqingyuan/gitwms

  • 相关阅读:
    2018-2019-1 20189221 《从问题到程序》第 6 周学习总结
    2018-2019-1 20189221 《Linux内核原理与分析》第七周作业
    《文献管理与信息分析》第 2 周学习总结
    2018-2019-1 20189221 《从问题到程序》第 5 周学习总结
    2018-2019-1 20189221 《Linux内核原理与分析》第六周作业
    2018-2019-1 20189206 《深入理解计算机系统》第一章学习笔记
    2018-2019-1 20189206 《从问题到程序》速读
    2018-2019-1 20189206 《深入理解计算机系统》速读
    2018-2019-1 20189206 《构建之法》速读
    2018-2019-1 20189206 《Linux内核原理与分析》第二周作业
  • 原文地址:https://www.cnblogs.com/qingyuan/p/3718178.html
Copyright © 2020-2023  润新知