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

    有更多实例程序下载。

  • 相关阅读:
    Javascript 公共代码(可重用)
    ExtJs之Ext.data.Store
    delete exists
    c++ builder adoquery sql语句的动态增加
    C++ XML解析之TinyXML篇
    oracle数据类型varchar2和varchar的区别
    adoquery查询结果如何赋给一个变量(delphi和c++ builder)
    没有安装 BCB 的机器上运行会提示 找不到 库之类
    select union 查询出来的结果,如何按指定顺序输出
    oracle 已有 表 增加 列
  • 原文地址:https://www.cnblogs.com/bluedoctor/p/1870095.html
Copyright © 2020-2023  润新知