专栏首页程序员的SOD蜜使用OQL“语言”构造ORM实体类的复杂查询条件

使用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 条评论
登录 后参与评论

相关文章

  • 使用SQLServer同义词和SQL邮件,解决发布订阅中订阅库丢失数据的问题

    最近给客户做了基于SQLServer的发布订阅的“读写分离”功能,但是某些表数据很大,经常发生某几条数据丢失的问题,导致订阅无法继续进行。但是每次发现问题重新做...

    用户1177503
  • 同步一个数据库要发多少个数据包?

     系列文章索引: [WCF邮件通信系统应用 之 数据同步程序 之 设计内幕 之 一] 同步一个数据库要发多少个数据包? [WCF邮件通信系统应用 之 数据同步...

    用户1177503
  • 一行代码调用实现带字段选取+条件判断+排序+分页功能的增强ORM框架

    问题:3行代码 PDF.NET 是一个开源的数据开发框架,它的特点是简单、轻量、快速,易上手,而且是一个注释完善的国产开发框架,受到不少朋友的欢迎,也在我们公...

    用户1177503
  • 设计模式之装饰器模式

    在日常生活中,装饰器模式的场景更多是的打扮了,一个妹子,嫌弃自己的脸长得不够漂亮,想换张脸很困难,但是化化妆还是很容易的(当然了,化妆也分男女的,此处指的是女士...

    Edison.Ma
  • python: cmp 内建函数 (py3中被取缔)

    比较两个对象x和y:如果x < y ,返回负数;x == y,返回0;x > y,返回正数。

    JNingWei
  • 汽车电子模块常用接口电路

    结合在实际系统设计中,模块与汽车其他电子模块进行信息互联,不同类型的接口电路实例,提供出来和大家一起来分享,希望大家一起来归纳和整理。 1. 低电流/信号输出...

    机器人网
  • 如何安全的使用Tor网络

    Tor是什么 Tor是互联网上用于保护您隐私最有力的工具之一,但是时至今日仍有许多人往往认为Tor是一个终端加密工具。事实上,Tor是用来匿名浏览网页和邮件发送...

    FB客服
  • velocity:宏(#macro)出现中文乱码

    最开始使用velocity时,输出中文乱码,我的解决办法 是在调用 mergeTemplate 方法时指定encoding为UTF-8,然后就正常了。 Velo...

    用户1148648
  • PL/SQL 游标变量

        游标变量与游标相似,有其共性,也有其不同点。就其共性来说两者都是指向多行查询的结果集中的当前行。都要经历声明,打开,检索与关闭的过程。所不同的是游标与游...

    Leshami
  • Netcracker提供NFV市场和集成服务

    今天,Netcracker公司及其母公司NEC根据网络功能虚拟化(NFV)市场的虚拟化组件,推出了一个网络即服务(NaaS)产品。该NaaS产品主要服务用户是将...

    SDNLAB

扫码关注云+社区

领取腾讯云代金券