今天,一个朋友问我,OQL可否支持CASE WHEN语句?他给的示例SQL如下:
select HName,case when IsEnable=1 then '启用' else '停用' from tb_User
这个问题已经不止这一个朋友来问我了,我想了下,还是把这个问题的解决写一篇博客,给大家一种新的解决方案。注意“新的方案”这个提法,我是不打算让OQL支持CASE WHEN这个特性的,为何要这样做呢?
- QL只解决 80%的普通查询,其它复杂的查询,应该依托于其它技术,否则会增加OQL的复杂性;
- 复杂的查询,可以借助于SOD框架的SQL-MAP技术,将SQL语句写在SqlMap.config文件中;
- 可以采用数据库视图或者计算列;
废话不多说,先直接看代码:
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?"启用":"停用"
}
}
}大家看看,这个“计算属性”是不是很好的起到了 SQL的CASE WHEN效果?
如何使用“计算属性”
具体举例来说,应该像下面的样子来使用包含计算列的实体类:
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框架一直以来的支持,更多信息,请参考 PDF.NET SOD 开源框架红包派送活动 && 新手快速入门指引
开源项目需要大家更多的支持,SOD开源项目网站:http://pwmis.codeplex.com
