网站首页 > 开源技术 正文
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这个特性的,为何要这样做呢?
- QL只解决 80%的普通查询,其它复杂的查询,应该依托于其它技术,否则会增加OQL的复杂性;
- 复杂的查询,可以借助于SOD框架的SQL-MAP技术,将SQL语句写在SqlMap.config文件中;
- 可以采用数据库视图或者计算列;
前面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?"启用":"停用"
}
}
}在这里,IsEnable 这样的属性,SOD框架称为“持久化属性”,因为它MAP了Tb_User表的字段IsEnable ,该字段称为“持久化属性字段”,持久化属性的get,set方法采用了SOD实体类特殊的方法构造。属性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
- 上一篇: 盘点阿里、腾讯、百度大厂C#开源项目
- 下一篇: 10款最好的GitHub的替代品!
猜你喜欢
- 2024-12-03 10款最好的GitHub的替代品!
- 2024-12-03 HighChats报表使用Cmvc导出本地图片
- 2024-12-03 盘点阿里、腾讯、百度大厂C#开源项目
- 2024-12-03 该备份的抓紧备份,Google Code 将在明年 1 月 25 日停止服务
- 2024-08-01 纯资源帖!要什么戳什么(资源百度百科)
- 2024-08-01 一行代码没写也敢邀功,当年的比尔·盖茨够胆大!
- 2024-08-01 CAD进阶技术,系统变量五(字母排序T-W),不只是0和1
- 2024-08-01 MVVMLight 1:MVVMLight介绍以及在项目中的使用
- 2024-08-01 如何体验军用级别的加密技术(军事级加密算法)
- 2024-08-01 微软被传证实收购 GitHub,交易金额尚不明确
欢迎 你 发表评论:
- 1579℃北京那些看上去很牛的车牌们!(北京厉害车牌)
- 1100℃2025年度视频去水印软件TOP5对比:哪款最值得用
- 668℃《我的世界》不同版本的差异 ——新手向
- 585℃新疆话里的“虫子”
- 541℃正畸治疗后的牙间黑三角
- 501℃蓝牙设备配对失败的系统性解决方案与技术解析
- 500℃中兴光猫 Telnet下设置大全(中兴光猫命令大全)
- 493℃未备份电脑文件数据恢复的七种方法
- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)

本文暂时没有评论,来添加一个吧(●'◡'●)