1. 程式人生 > 其它 >使用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

有更多例項程式下載。