使用OQL“语言”构造ORM实体类的复杂查询条件
时间:2022-04-28
本文章向大家介绍使用OQL“语言”构造ORM实体类的复杂查询条件,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
OQL”语言“ 是PDF.NET数据开发框架的实体对象查询语言,一直以来,ORM的复杂查询条件都是困扰ORM的问题,所以很多时候不得不舍弃ORM,直接手工拼接SQL。我们来看看OQL是怎么解决这些问题的,现在举一个今天同事遇到的问题:
有这样一个实体类 MyEntity,实体类的具体定义在此忽略,有兴趣的朋友请看我的博客。
MyEntity e=new MyEntity();
e.F1="1";
e.F2="2";
e.F3="a";//其它可选值 a,b,c.....
e.F5="A";//其它可选值 A,B,C....
必要条件 F1 And F2,可选条件 F3,F4,F5,准备输出下面类似的SQL语句:
SELECT * FROM TABLE1 WHERE
(F1='1' AND F2='2')
And
(F3='a' OR F3='b' OR F3='c' )
And
(F5='A' OR F5='B' OR F5='C' )
下面我们来看看怎么使用OQL来构造这个SQL语句,
代码
OQLCompare cmp = new OQLCompare(e);
OQLCompare cmpCondtion1= cmp.Compare(e.F1) & cmp.Compare(e.F2);
//等于实体类属性值的比较可以直接这样写 cmp.Compare(e.F2)
OQLCompare cmpResult=null;
//处理字段F3的条件
string[] ValueF3={"a","b","c"};//具体获取条件值的过程此略,用一个数组代替。
OQLCompare cmpCondtionF3=null;
if(ValueF3.Length>0)
{
cmpCondtionF3=cmp.Compare(e.F3,"=",ValueF3[0]);//取第一个
if((ValueF3.Length>1)
{
for(int i=1;i<ValueF3.Length;i++)
cmpCondtionF3 = cmpCondtionF3 | cmp.Compare(e.F3,"=",ValueF3[i]);//将其它条件作为 OR 条件
}
cmpResult= cmpCondtion1 & cmpCondtionF3;
}
//处理字段F5的条件
string[] ValueF5={"A","B","C"};
OQLCompare cmpCondtionF5=null;
if(ValueF5.Length>0)
{
cmpCondtionF5=cmp.Compare(e.F5,"=",ValueF5[0]);//取第一个
if((ValueF5.Length>1)
{
for(int i=1;i<ValueF5.Length;i++)
cmpCondtionF5 = cmpCondtionF5 | cmp.Compare(e.F3,"=",ValueF5[i]);//将其它条件作为 OR 条件
}
cmpResult= cmpCondtion1 & cmpCondtionF5;
}
现在我们构造成功了条件对象 cmpResult,接下来看看怎么样构造完整的OQL语句:
//e 是前面的实体类对象实例
OQL q=OQL.From(e).Select().Where(cmpResult).End;
当然也可以这样写,但没有上面简单:
OQL q=new OQL(e);
q.Select().Where(cmpResult);
如果只想查询F1,F2属性的值,这样写:
OQL q=new OQL(e);
q.Select(e.F1,e.F2).Where(cmpResult);
最后就可以到数据库查询实体了,非常简单:
List<MyEntity> result=EntityQuery<MyEntity>.QueryList(q);
至此,一个复杂的ORM查询使用OQL语言就完成了,是否方便,还得大家评说。
PDF.NET官网:http://www.pwmis.com/sqlmap
有更多实例程序下载。
- 3224: Tyvj 1728 普通平衡树
- 【LeetCode 136】 关关的刷题日记32 Single Number
- 1599: [Usaco2008 Oct]笨重的石子
- 【LeetCode 136】 关关的刷题日记33 Intersection of Two
- 1218: [HNOI2003]激光炸弹
- Java多线程高并发学习笔记(一)——Thread&Runnable
- 1257: [CQOI2007]余数之和sum
- 【LeetCode 136】 关关的刷题日记34 Intersection of Two Arrays II
- 1724: [Usaco2006 Nov]Fence Repair 切割木板
- 【LeetCode 202】 关关的刷题日记35 – Leetcode 202. Happy Number
- JAVA多线程高并发学习笔记(三)——Callable、Future和FutureTask
- 算法模板——Trie树
- JavaScript Alert 函数执行顺序问题
- 算法模板——计算几何1(图形面积)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- R语言ggmap空间可视化机动车碰撞–街道地图热力图
- R语言ggmap空间可视化机动车交通事故地图
- 基于matlab的Lorenz系统仿真可视化
- 使用R语言对进行空间数据可视化
- R语言中基于混合数据抽样(MIDAS)回归的HAR-RV模型预测GDP增长
- R语言马尔可夫体制转换模型Markov regime switching
- Python中的ARIMA模型、SARIMA模型和SARIMAX模型对时间序列预测
- python3用ARIMA模型进行时间序列预测
- R语言马尔可夫转换模型研究交通伤亡人数事故预测
- scrapy爬虫框架和selenium的使用:对优惠券推荐网站数据LDA文本挖掘
- 使用R语言进行Metroplis-in-Gibbs采样和MCMC运行分析
- R语言中的马尔科夫机制转换(Markov regime switching)模型
- R语言ARMA-EGARCH模型、集成预测算法对SPX实际波动率进行预测
- nginx快速入门
- R语言中进行期权定价的Heston模型