如何用ORM支持SQL语句的CASE WHEN?

OQL如何支持CASE WHEN?

今天,一个朋友问我,OQL可否支持CASE WHEN语句?他给的示例SQL如下:

select HName,case when IsEnable=1 then ‘启用‘ else ‘停用‘ from tb_User

OQL是SOD框架ORM查询语言,它类似Linq,但是它诞生的历史比Linq早,并且更加接近SQL语法。所以,对SOD框架而言,对应ORM如何支持CASE WHEN,就等于是问OQL如何支持CASE WHEN了。

这个问题已经不止这一个朋友来问我了,我想了下,还是把这个问题的解决写一篇博客,给大家一种新的解决方案。
注意“新的方案”这个提法,我是不打算让OQL支持CASE WHEN这个特性的,为何要这样做呢?

  1. QL只解决 80%的普通查询,其它复杂的查询,应该依托于其它技术,否则会增加OQL的复杂性;
  2. 复杂的查询,可以借助于SOD框架的SQL-MAP技术,将SQL语句写在SqlMap.config文件中;
  3. 可以采用数据库视图或者计算列;

前面3种原因,第2,3条方法也可以看做是此问题的解决方案,但是它们都需要增加更多的工作量,如果OQL能够直接支持还是更方便些,所以,我今天在这里给大家第4种解决方案:

实体类的计算属性

废话不多说,先直接看代码:

public class User:EntityBase
{
  public User()
  {
      TableName="tb_User";
  }

  public string HName{
    get{return getProperty<string>("HName");}
    set{setProperty<string>("HName",value,50);}
  }

  public bool IsEnable{
    get{return getProperty<bool>("IsEnable");}
    set{setProperty<bool>("IsEnable",value);}
  }

  public string IsEnableDescrition
  {
     get{
        return IsEnable?"启用":"停用"
     }
   }

}

在这里,HName,IsEnable 这样的属性,SOD框架称为“持久化属性”,因为它MAP了Tb_User表的字段IsEnable ,该字段称为“持久化属性字段”。

持久化属性的get,set方法采用了SOD实体类特殊的方法 setProperty,getProperty 构造,所以属性IsEnableDescription 它不是持久化属性,但是它利用了IsEnable这个持久化属性,对持久化属性进行“计算”,因此,我们这里称呼这样的属性为实体类的“计算属性”。

大家看看,这个“计算属性”是不是很好的起到了 SQL的CASE WHEN效果?

只要忘记了数据库,不要遇到问题就去想如何用SQL语句解决,是不是思路豁然开朗?

如何使用“计算属性”

前面说过,实体类的“计算属性”本质上不是一个“持久化属性”,它是对持久化属性的计算处理,原理上非常类似SQLServer表上面的计算列。
因此,在SOD框架上使用“计算属性”,有一个必须注意的原则:“计算属性”不可以出现在OQL语句中。

具体举例来说,应该像下面的样子来使用包含计算列的实体类:

User user=new User(){ HName="张三"};
var q=OQL.From(user)
  .Select(user.HName,user.IsEnable)
  .Where(user.HName)
.END;

User user2= EntityQuery<User>.QueryObject(q);
string isEnableDesction =user2.isEnableDesction;

有关上面SOD框架查询使用的入门介绍,大家可以参考《.NET ORM 的 “SOD蜜”--零基础入门篇 》

感谢大家对SOD框架一直以来的支持,更多信息,请参考 PDF.NET SOD 开源框架红包派送活动 && 新手快速入门指引

开源项目需要大家更多的支持,SOD开源项目网站:http://pwmis.codeplex.com

时间: 07-02

如何用ORM支持SQL语句的CASE WHEN?的相关文章

sql 语句之 case

case语句语法: --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END --Case搜索函数 CASE WHEN sex = '1' THEN '男' WHEN sex = '2' THEN '女' ELSE '其他' END 首先创建一张users表,其中包含id,name,sex三个字段,表内容如下: 复制代码 SQL> drop table users purge; drop table users p

Oracle的sql语句中case关键字的用法

例子1: a)查询列中有"_"开头的列名时,需要用双引号引起来. b)使用"case"关键字,根据分数直接判断是否及格. create table tbl_score( id NUMBER(4), --id name varchar2(30), --名称 score NUMBER(3), --分数 otherscore NUMBER(3) --其他分数 ); select t.id as "_id", t.name as name, case w

如何用一条SQL语句从登录日志表中查询统计出每个人登录的次数

这绝对是基本功,没有任何理由说不会,甚至不知道,作为自己面壁思过的一道题 SQL: SELECT user_name, COUNT(*) as count FROM log GROUP BY user_name 如果加上HAVING则作为count数量的条件查询控制, 如:HAVING count > 1; 意为,登录次数多于一次的用户及对应的登录次数.

sql语句:CASE WHEN END 的用法

select b,c, CASE a WHEN '1' THEN '1001' WHEN '2' THEN '1002' ELSE '1003' end from test1

求问如何用一句sql语句来代替asp.net的程序代码?yrsxn

. 种菜,选种子很重要.别买了滥情的种子,即使开花很漂亮,却结了空心的菜,最后一无所有,原因不是好友会偷菜,而是他自己跑了. 8. 如果一场爱情从开始起,就注定是一场赌博,那么谁认真的想要压上一切去赢得赌博时,谁就一定会输得精光,因为赌博里只 我记得你在昨天 豪迈的放歌 黑夜陪你一起奔腾 连星星也隐没了 日光倾城之时 有人陪你一起等待夕阳 落日的余晖映出永恒的真诚 我想要定格成永远,只有你的脸 却憾恨着不能不说再见 你,是我逝去的记忆 似水流年,流转着温暖 檐下的花儿静静开,夜风似影久等在门外.

SQL语句删除表中所有记录的方法

如何用一条sql语句删除表中的所有记录,这里分享下我的方法.参考链接: sql语句如何删除重复记录?四种方法 sql语句如何删除重复记录?教程详解 TRUNCATE TABLE删除表中的所有行,而不记录单个行删除操作. 语法TRUNCATE TABLE name 参数name 是要截断的表的名称或要删除其全部行的表的名称. 注释TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 DELETE 速度

java执行多条SQL语句

一次执行多条SQL的技术要点如下: DatabaseMetaData接口是描述有关数据库的整体综合信息,由于DatabaseMetaData是接口,所以没有构造方法,故不能使用new来创建DatabaseMetaData对象,但是可以通过Connection的getMetaData()方法创建.例如:DatabaseMetaData md=con.getMetaData(). DatabaseMetaData类的supportsBatchUpdates方法用于判断此数据库是否支持批量更新.其返回

C#代码验证sql语句是否正确(只验证不执行sql)的方法

转自 :http://www.jquerycn.cn/a_15010 为大家介绍如何用C#验证sql语句的正确性,就像sql查询分析器中的检测代码功能一样,有需要的朋友,可以参考下. 需要用到如下的知识:SET PARSEONLY检查每个 Transact-SQL 语句的语法并返回任何错误消息,但不编译和执行语句.SET PARSEONLY { ON | OFF }当 SET PARSEONLY 为 ON 时,SQL Server 只分析语句.当 SET PARSEONLY 为 OFF 时,SQ

SQL语句学习(一)----通用语法,DDL,DML基础语句

1.1     SQL概述 1.1.1     SQL语句介绍 结构化查询语言(Structured Query Language)简称SQL,是关系型数据库管理系统都需要遵循的规范.不同的数据库生产厂商都支持SQL语句,但都有特有内容. 1.1.2     SQL语句分类 SQL分类: 数据定义语言:简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等.关键字:create,alter,drop等 数据操作语言:简称DML(Data Manipu