使用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

有更多实例程序下载。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏农夫安全

SQL注入精讲

SQL注入的三大块: GET POST Cookie GET GET提交方式:在URL传递参数的请求,就是GET方式,是以name=value的方式出现 例如:...

3729
来自专栏python成长之路

(解释文)My SQL中主键为0和主键自排约束的关系

1885
来自专栏idba

MySQL 5.7新特性之五

本系列文章基于 5.7.12 版本讲述MySQL的新特性。从安装,文件结构,SQL ,优化 ,运维层面 复制,GITD等几个方面展开介绍 5.7 的新特性和功能...

1082
来自专栏行者常至

java中的单例模式浅析

Singleton模式主要作用是保证在java应用程序中,一个类class只有一个实例存在。在很多操作中,比如建立目录、数据库连接都需要这样的单线程操作。

691
来自专栏好好学java的技术栈

java设计模式系列:单例模式

  1、单例类只能有一个实例。   2、单例类必须自己创建自己的唯一实例。   3、单例类必须给所有其他对象提供这一实例。

933
来自专栏PingCAP的专栏

TiDB 源码阅读系列文章(四)Insert 语句概览

本文为 TiDB 源码阅读系列文章的第四篇。上一篇文章简单介绍了整体流程,无论什么语句,大体上是在这个框架下运行,DDL 语句也不例外。

4225
来自专栏PHP在线

介绍mysql中replace方法

今天在编程的时候,学习了replace into的用法,真的很好用,是insert into的增强版。在向表中插入数据时,我们经常会遇到这样的情况:1、首先判断...

3084
来自专栏我爱编程

Day24访问数据库

使用SQLite SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在i...

3804
来自专栏散尽浮华

mysql表名忽略大小写问题记录

问题描述: 一开发同事在linux下调一个程序老是报错说找不到表,但是登陆mysql,show tables查看明明是已经创建了这张表的!!如下: mysql>...

3287
来自专栏前端侠2.0

oracle中,通过触发器,记录每个语句影响总行数

       业务系统中,有一步“抽数”流程,就是把一些数据从其它服务器同步到本库的目标表。这个过程有可能 多人同时抽数,互相影响。有测试人员反应,原来抽过的数...

1022

扫码关注云+社区

领取腾讯云代金券