使用OQL“語言”構造ORM實體類的複雜查詢條件
阿新 • • 發佈:2022-04-28
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
有更多例項程式下載。