Silverlight輕量級查詢對比

2021-09-17 06:24:44 字數 3221 閱讀 5944

資訊系統的本質是對資訊的輸入、查詢、計算、儲存和輸出操作,這就像金融的本質是價值的跨時空交換一樣,雖然資訊系統有各種各樣的「衍生品」但都離不開資訊,離不開資訊的表現形式:結構化與非結構化資料,而結構化資料幾乎已經成為了上世紀90年代以來資訊系統的必需品,譬如資料庫物件、xml標籤化資料、實體類物件,我們都可以認為是結構化資料。特別是在企業級應用中對結構化資料的處理能力往往是技術選型的關鍵指標,本期我們就來深入**一下silverlight的資料查詢能力。

\ 筆者在《silverlight之重》一文中曾提到silverlight整合了linq等高階查詢語言,具有多樣化的資料處理與查詢方式,使得開發者在資料處理上有更多選擇。下面我們就通過乙個案例來了解一下silverlight在客戶端強大的資料處理能力。\\

\ 案例需求:「在大量的實體物件中找出滿足條件的物件」。

\ 這個需求描述只有一句話,很像現實專案中需求提出者言簡意賅的口吻。但在這句話背後需要程式設計人員做的事情很多,首先需要構造出大量的實體物件資料,這需要我們建立承接結構化資料的是實體類,再通過資料生成器類來完成大量資料的產生工作;其次我們需要設計並實現silverlight的查詢類,最後我們需要將結果集輸出到頁面上。通過提煉名詞,我們設計出如下類圖:

\ 實體類testmodel是按客戶模型進行設計,包括姓名、性別、生日、年齡等屬性。

\ 資料產生器類datagenerator類通過createbycnt\u0026lt;t\u0026gt;方法產生資料。資料產生器在企業級開發中常常用在大資料量效能測試與滲透測試中,本案例主要使用它來模擬真實的客戶資料。

\ 為了達到元件化復用和介面與邏輯分離的目的,筆者將silverlight各種查詢方式的具體實現放在queryworker類中,下面是silverlight在客戶端適用的幾種輕量級查詢方式:

\直接查詢法\

通過for或者foreach的迴圈直接查詢物件集合,找出滿足姓名包含傳入字元要求的記錄,並將其新增到結果集。該方法適用於大多數在開發時明確查詢條件的應用,本案例中實現方法directquery的**如下:

\

\publicvoid directquery(string querystr, list\u0026lt;testmodel\u0026gt; data, reflist\u0026lt;object\u0026gt; result) \    } \    //通知完成查詢 \    invokequerycomplete(eventargs.empty); \}\
\反射查詢法\

當查詢條件中實體屬性需要在執行時才能確定時,直接查詢法就顯得不夠靈活了,這就需要通過c#反射方法獲得執行時指定的實體屬性資訊propertyinfo,再通過getvalue方法檢查該屬性值是否滿足包含傳入字元要求。本案例中實現方法reflectquery的**如下:

\

\publicvoid reflectquery(string querystr, list\u0026lt;testmodel\u0026gt; data, reflist\u0026lt;object\u0026gt; result) \ \    } \    //通知完成查詢 \    invokequerycomplete(eventargs.empty); \}
\linq查詢法\

linq是.net框架下特有的宣告式語言,開發者可以通過這種類似sql的語言快速構建資料邏輯,而避免了原有物件導向操作中的複雜過程,筆者認為linq語言的表示式分為三個層次:第一層次是與sql類似的linq表示式;第二層次為lambda表示式;第三層次是基於expression類的表示式樹,這是linq的最裡層,也是linq實現動態的核心。本案例中實現方法linqquery的**如下:

\

\publicvoid linqquery(string querystr, list\u0026lt;testmodel\u0026gt; data, reflist\u0026lt;object\u0026gt; result) \
\

如果使用lambda表示式,可以寫成data.where(t =\u0026gt; t.name.contains(querystr))的篩選條件,與直接寫查詢表示式的含義一致。後面要介紹的兩種查詢方法實際都是linq的不同實現方式,只是在靈活性上要比直接寫表示式更勝一籌。

\表示式樹查詢法\

相較於linq查詢法,表示式樹查詢更為複雜但靈活性更強。表示式樹可以在執行時動態構建查詢語句,它也是動態linq的實現基礎,下面我就來看一下本案例中表示式樹查詢實現方法expressionquery的**:

\

\publicvoid expressionquery(string querystr, list\u0026lt;testmodel\u0026gt; data, reflist\u0026lt;object\u0026gt; result) \{ \    iqueryable\u0026lt;testmodel\u0026gt; custs = data.asqueryable(); \    //構造引數表示式it \    parameterexpression it = expression.parameter(typeof(testmodel), \"it\"); \    //構造待篩選字元querystr的常量表示式 \    expression funparam = expression.constant(querystr); \    //獲得it引數的name屬性資訊,實現lambda表示式:it.name \    expression name = expression.property(it, typeof(testmodel).getproperty(\"name\")); \    //獲取字串類的contains方法資訊 \    methodinfo containsfun = typeof(string).getmethod(\"contains\

輕量級重量級

輕量級重量級某種程度上是以啟動程式需要的資源來決定。比如,ejb啟動的時候,需要消耗大量的資源,記憶體,cpu等,所以是重量級。而spring則不,所以是輕量級框架。量級主要是看對容器的依賴性所決定的,依賴性越小,越輕量.ejb往往內部做了很多服務,網上的說法是買一得三 而且你不想要就不行!比方說我...

輕量級容器

什麼是輕量級容器?為什麼我們需要輕量級容器?什麼是輕量級容器 所謂容器 container 指應用 的執行框架。業務物件在容器裡執行,被容器管理。像ejb就是過去管理j2ee業務物件時最常用的容器。任何容器都應該包含如下服務 上面講的是容器核心模組應該提供的服務,但是容器還必須提供其它一些服務,增加...

輕量級框架

1.概述 輕量級框架一般由struts,spring組成,側重於減小開發的複雜度,相應的它的處理能力便有所減弱 如事務功能弱 不具備分布式處理能力 比較適用於開發中小型企業應用。2.定義 輕量級框架是相對於重量級框架的一種設計模式 輕量級框架不帶有侵略性api,對容器也沒有依賴性,易於進行配置,易於...