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....
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 ' )
(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语句,
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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;
}
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 = OQL.From(e).Select().Where(cmpResult).End;
当然也可以这样写,但没有上面简单:
OQL q
=
new
OQL(e);
q.Select().Where(cmpResult);
q.Select().Where(cmpResult);
如果只想查询F1,F2属性的值,这样写:
OQL q
=
new
OQL(e);
q.Select(e.F1,e.F2).Where(cmpResult);
q.Select(e.F1,e.F2).Where(cmpResult);
最后就可以到数据库查询实体了,非常简单:
List
<
MyEntity
>
result
=
EntityQuery
<
MyEntity
>
.QueryList(q);
至此,一个复杂的ORM查询使用OQL语言就完成了,是否方便,还得大家评说。
PDF.NET官网:http://www.pwmis.com/sqlmap
有更多实例程序下载。