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 = , /// <summary>
/// IN
/// </summary>
In = , /// <summary>
/// 大于 >
/// </summary>
Gth = , /// <summary>
/// 小于 <
/// </summary>
Lth = , /// <summary>
/// 等于 =
/// </summary>
Eth = , /// <summary>
/// 大于等于 >=
/// </summary>
Geth = , /// <summary>
/// 小于等于 <=
/// </summary>
Leth = , /// <summary>
/// 不等于 !=
/// </summary>
NotEth = , /// <summary>
/// Is 关键字
/// </summary>
Is = , /// <summary>
/// Is Not 关键字
/// </summary>
IsNot = , /// <summary>
/// Between AND关键字
/// </summary>
Between = , /// <summary>
/// OR LIKE
/// </summary>
OrLike = , /// <summary>
/// OR IN
/// </summary>
OrIn = , /// <summary>
/// OR 字段>
/// </summary>
OrGth = , OrLth = , OrEth = , OrGeth = , OrLeth = , OrNotEth = , OrIs = , OrIsNot = , OrBetween = , /// <summary>
/// +=
/// </summary>
AddEth=, /// <summary>
/// -=
/// </summary>
SubtractEth=, /// <summary>
/// *=
/// </summary>
MultiplyEth=, /// <summary>
/// /=
/// </summary>
DivideEth=, /// <summary>
/// %
/// </summary>
Modulo=, /// <summary>
/// +
/// </summary>
Add=, /// <summary>
/// -
/// </summary>
Subtract = , /// <summary>
/// *
/// </summary>
Multiply = , /// <summary>
/// /
/// </summary>
Divide=
}
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
Git.Framework 框架随手记--ORM条件组合的更多相关文章
- Git.Framework 框架随手记--ORM编辑删除
前面一篇文章<Git.Framework 框架随手记--ORM新增操作>主要讲解了如何使用Git.Framework往数据库中添加数据.其操作过程相对简单,本章主要记录如何编辑数据和修改数 ...
- Git.Framework 框架随手记--ORM项目工程
前面已经简单介绍过了该框架(不一定是框架),本文开始重点记录其使用过程.可能记录的内容不是太详尽,框架也可能非常烂,但是里面的代码句句是实战项目所得.本文非教唆之类的文章,也非批判之类的文章,更不是炫 ...
- Git.Framework 框架随手记--ORM查询数据集合 二
一. 分组查询 在SQL中使用Group By 来对数据分组,在实际中分组中一般与聚合函数一并使用.在Git.Framework中提供了相应的分组方法 DataTable Group(T entit ...
- Git.Framework 框架随手记--ORM查询数据集合 一
本文记录Git.Framework之ORM中最为浓墨重彩的一篇,查询集合.根据自己做的项目统计这个是使用频率最高的一个. 一. 查询集合方法简介 (1)List<T> GetList(); ...
- Git.Framework 框架随手记--ORM查询返回实体对象
使用ORM有一个优势,可以通过某种机制将数据库中的数据转化为自己想要的对象形式数据.本章记录一下如何使用Git.Framework返回实体对象 一. Git.Framework 中提供的方法 在Git ...
- Git.Framework 框架随手记--ORM新增操作
本篇主要记录具体如何新增数据,废话不多说,开始进入正文. 一. 生成工程结构 上一篇已经说到了如何生成工程结构,这里在累述一次. 1. 新建项目总体结构 使用VS新建项目结构,分层结构可以随意.我们使 ...
- Git.Framework 框架随手记--存储过程简化
在很多的ORM中对存储过程操作都是一个棘手的地方,因为存储过程是一段预编译的代码,其中可以包含很多处理过程.在Git.Framework中也同样存在这样的问题,目前没有能力解决这个问题.但是对于存储过 ...
- Git.Framework 框架随手记--历史原因
Git.Framework 是近几年工作的一些工作经验总结,虽不能和某些知名的框架相提并论,但是还是比较实用的.此框架经过三年多的升级和维护,已经具有较强的实用性,在此记录该框架的使用操作方式,贡献给 ...
- Git.Framework 框架随手记-- 分享一个"比较垃圾"的项目
本文主要分享一个Git.Framework 开发的一个项目的部分源码,此项目代码"比较垃圾",所以请各位码农,码畜,码神,码圣勿喷!发此文只为记录工作问题以及分享问题! 一. 项目 ...
随机推荐
- 在Ubuntu Server下搭建LAMP环境学习记录
更新于2015/6/16日,因图片地址失效,请在此地址查看:http://note.youdao.com/share/?id=1c249ae6dc6150cbf692adec67b23a33& ...
- 基于go-ceph创建CEPH块设备及快照
一.代码执行前准备 1.系统中安装了CEPH集群 2.GOPATH目录下存在src/github.com/noahdesu/go-ceph代码库 3.在ubuntu 14.04下还需apt-get l ...
- POJ 2318 TOYS【叉积+二分】
今天开始学习计算几何,百度了两篇文章,与君共勉! 计算几何入门题推荐 计算几何基础知识 题意:有一个盒子,被n块木板分成n+1个区域,每个木板从左到右出现,并且不交叉. 有m个玩具(可以看成点)放在这 ...
- CSU 1116 Kingdoms
题意:给你n个城市,m条被摧毁的道路,每条道路修复需要c元,总共有k元,给你每个城市的人口,问在总费用不超过k的情况下 与1号城市相连的城市的最大总人口(包括1号城市) 思路:1号城市是必取的,剩余最 ...
- bundle是什么?
bundle就是一个数据对象,像Map,HashMap一样key-value键值对的方式存放数据.在android中用于应用程序之间数据传输,不过是要靠对象使用的 谢谢,又知道了一种在Activity ...
- java 21 - 9 复制图片的4种方式
需求:复制图片 分析: 因为图片我们用记事本打开后无法读懂,所以用字节流 并且字节流复制有4种方式,所以我们尝试4种方式. 推荐第四种:缓冲字节流一次读取一个字节数组 首先写main方法: publi ...
- (已解决) 未能加载文件或程序集“Newtonsoft.Json, Version=4.0.0.0, Culture=neutral,
在项目web.config里面添加: <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30AD4F ...
- YII获取刚插入数据的id主键
单条数据时model->attributes['id']; 循环插入时使用 Yii::app()->db->getLastInsertID() 获取 循环插入时需要每次插入后重置 m ...
- ftp虚拟账号登陆
配置使用虚拟用户登录的FTP服务器,可以避免使用操作系统帐号作为FTP用户带来的一些安全问题,也便于通过数据库或其它程序来进行管理.废话不多说,这里记录下ftp虚拟账号登陆的部署过程及其中遇到的问题: ...
- js学习推荐
1.汤姆大叔 http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html