iT邦幫忙

DAY 26
3

OpenAccess ORM for Oracle 實戰演練系列 第 22

OpenAccess ORM for Oracle 實戰演練 Day 26

透過OpenAccessLinqDataSource的Expression Editor設定篩選條件
前一篇「透過OpenAccessLinqDataSource快速排序、分頁」我們透過智慧標籤的協助,在設定資料來源時,一併完成分頁和排序的設定,但在篩選資料時,因為沒有提供 Contains 選項,導致必須在關閉精靈視窗後,再手動調整。其實這個動作,可以利用 OpenAccessLinqDataSource 的運算式編輯器(Expression Editor)完成。
還記得前一篇文章,因為設定資料來源精靈視窗的【Where】頁籤中,Operator 下拉清單中,沒有 Contains 可以選擇,所以我們只好隨意選一個運算子,然後在精靈視窗關閉後,再手動調整 Where 的運算式,變成如下的樣式:

<telerik:OpenAccessLinqDataSource ID="oasrcCustomers" runat="server" ContextTypeName="OALinqDataSourceWeb01.NWModel" EntityTypeName="" OrderBy="COUNTRY desc, CITY, ADDRESS" ResourceSetName="Customers" Select="new (CITY, COMPANYNAME, CONTACTNAME, COUNTRY, CUSTOMERID)" Where="CONTACTNAME.Contains(@CONTACTNAME)">
    <WhereParameters>
        <asp:ControlParameter ControlID="txtKeyWord" PropertyName="Text" DefaultValue="" Name="CONTACTNAME" Type="String"  ConvertEmptyStringToNull="false"></asp:ControlParameter>
    </WhereParameters>
</telerik:OpenAccessLinqDataSource>

現在,我們再度叫出智慧標籤,重新進入設定資料來源的精靈視窗,切換到【Where】頁籤:

竟然和上一次不一樣了!上一次長的是這樣:

其實這個頁籤現在呈現的樣貌,就是本篇文章的主題,運算式編輯器(Expression Editor)。

運算式編輯器提供我們自訂 OpenAccessLinqDatasource 控制項要執行 Delete, GroupBy, Insert, OrderBy, OrderGroupsBy, Select, Update 和 Where 的查詢運算式,讓我們不必受限於精靈視窗所提供選項,大大提高此控制項的靈活性!

但是該如何開啟運算式編輯器呢?如果都要先手動調整控制項 Html 原始碼,再啟動精靈視窗,實在太麻煩!所以,其實正規的方式是叫出 OpenAccessLinqDataSource 控制項的屬性視窗,然後在要自訂運算式的屬性上按【…】鈕即可。

PS. 請注意,這裡有一個 UI 上的 Bug,就是如果是在『原始檔』模式裡叫出 OpenAccessLinqDataSource 屬性視窗,在上述這些可以自訂運算式的屬性值旁邊,不會出現【…】鈕,一定要在『設計』模式下,才會有【…】鈕。

畫面上的欄位我們逐一說明如下:
● 【Automatically generate the Where expression based on the provided parameters】選項若勾選,我們就不能輸入【Where Expression】,此時 OpenAccessLinqDataSource 會自動依我們在 Html 中所設定的參數(例如:WhereParameters、OrderByParameters),自動建立查詢運算式。想當然爾,自動建立就要示,它只會用最簡單的方式處理,像 WhereParameters 他預設會用「==」運算子處理。
通常我們會進入此畫面,都是要撰寫較複雜的運算,所以當然不大可能勾選此項目。
● 【Where Expression】讓我們自訂運算式的欄位,例如:我們可以把運算式改成 CONTACTNAME.StartsWith(@CONTACTNAME),就變成連絡人姓名開頭符合的就會顯示:

● 【Paramters】區塊,就是設定查詢條件的值要繫結到那裡,可以選擇的標的很多,不過大多情境當然還是用頁面的控制項或網址傳入參數。

下圖是另一個示範,我們現在做更複雜的查詢,把運算式改成

CONTACTNAME.StartsWith(@CONTACTNAME) Or COMPANYNAME.Contains(@KeyWords)

看看原始碼會長成什麼樣(請記得,新增加的 ControlParameter 還是要手動加上 ConvertEmptyStringToNull="false" ):

<telerik:OpenAccessLinqDataSource ID="oasrcCustomers" runat="server" ContextTypeName="OALinqDataSourceWeb01.NWModel" EntityTypeName="" OrderBy="COUNTRY desc, CITY, ADDRESS" ResourceSetName="Customers" Select="new (CITY, COMPANYNAME, CONTACTNAME, COUNTRY, CUSTOMERID)" Where="CONTACTNAME.StartsWith(@CONTACTNAME) Or COMPANYNAME.Contains(@KeyWords)">
    <WhereParameters>
        <asp:ControlParameter ControlID="txtKeyWord" PropertyName="Text" DefaultValue="" Name="CONTACTNAME" Type="String"  ConvertEmptyStringToNull="false"></asp:ControlParameter>
        <asp:ControlParameter ControlID="txtKeyWord" DefaultValue="" Name="KeyWords" PropertyName="Text" ConvertEmptyStringToNull="false" />
    </WhereParameters>
</telerik:OpenAccessLinqDataSource>

編譯後檢視頁面,看生出來的 Sql:

執行結果:


上一篇
OpenAccess ORM for Oracle 實戰演練 Day 25
下一篇
OpenAccess ORM for Oracle 實戰演練 Day 27
系列文
OpenAccess ORM for Oracle 實戰演練26

尚未有邦友留言

立即登入留言