為OpenAccessLinqDataSource設定過濾條件,取出符合條件的資料

  • 1533
  • 0

為OpenAccessLinqDataSource設定過濾條件,取出符合條件的資料

查詢資料應該是 OpenAccessLinqDataSource 控制項最多應用的場合,而查詢資料幾乎都必須進行過濾,本篇就要說明如何為 OpenAccessLinqDataSource 設定過濾條件。

----------

延續前兩篇 OALinqDataSourceWeb01 專案,我們加入一個新的頁面:FilteringData.aspx,然後加入以下控制項:

  • 一個 DropDownList,名為 ddlCountry,AutoPostBack 設定為 True。
  • 一個 GridView,名為 gvList。
  • 兩個 OpenAccessLinqDataSource,名為 oasrcCountry、oasrcCustomers。
  • 一個 Label,名為 lblLog。
<%@ Register assembly="Telerik.OpenAccess.Web.40" namespace="Telerik.OpenAccess.Web" tagprefix="telerik" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>過濾資料</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>    
        國家:<asp:DropDownList ID="ddlCountry" runat="server" AutoPostBack="True">
        </asp:DropDownList>
        <br />
        <asp:GridView ID="gvList" runat="server">
        </asp:GridView>
        <telerik:OpenAccessLinqDataSource ID="oasrcCountry" Runat="server" />
        <telerik:OpenAccessLinqDataSource ID="oasrcCustomers" Runat="server" />
        <asp:Label ID="lblLog" runat="server" />
    </div>
    </form>
</body>
</html>

接著我們設定 oasrcCountry 的資料來源,指定取出 Customers.Country 的資料:

這裡會有個狀況要處理,因為 Customers 很多,Country 資料會出現重覆,所以 DropDownList 不需要保留重覆的國家,我們應該要做去重覆(Distinct)的動作,但是很不幸的,OpenAccessLinqDataSource 控制項並不支直接設定 Distinct 處理,我們必須透過 Selecting 事件替換 oasrcCountry 的查詢 LINQ和排序的查詢動作。暨然要去重覆了,當然我們就順便把國家做個排序:

    Inherits System.Web.UI.Page

    Private dbcxt As NWModel
    Private tracer As MyNorthwindTraceListener

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If dbcxt Is Nothing Then
            dbcxt = New NWModel()
        End If
        If tracer Is Nothing Then
            tracer = New MyNorthwindTraceListener(New StringBuilder())
            lblLog.Text = ""
        End If
    End Sub

    Private Sub oasrc_Selected(sender As Object, e As Telerik.OpenAccess.Web.OpenAccessLinqDataSourceStatusEventArgs) Handles oasrcCountry.Selected, oasrcCustomers.Selected
        lblLog.Text = tracer.GetLogString()
    End Sub

    Private Sub oasrcCountry_Selecting(sender As Object, e As Telerik.OpenAccess.Web.OpenAccessLinqDataSourceSelectEventArgs) Handles oasrcCountry.Selecting
        Dim countries = (From c In dbcxt.Customers
                         Select New With {.COUNTRY = c.COUNTRY}).Distinct() _
                                                                .OrderBy(Function(x) x.ToString())
        e.Result = countries
    End Sub

End Class

請注意,因為 OpenAccessLinqDataSource 控制項不能設定 Distinct 的行為,所以我們只好在 Selecting 事件中,建立自訂的 LINQ 查詢。另外請注意,因為頁面上的 DropDownList 必須指明要繫結的欄位,所以我們 LINQ 查詢出來的匿名類別,必須明確設定 COUNTRY 屬性名稱(或任何明確的名字),稍後才能正確繫結。

上面的 LINQ 語法有個小技巧和大家分享,因為匿名型別不能排序(未實做 IComparable),但是,我們知道查詢結果 Country 屬性其實是字串型別資料,所以在排序的委派中,直接調用 ToString() 函式,啟用 String 型別的預設排序,排序作業就完成了。

除此之外,因為我們先前有學過如何建立 TraceListener,所以我們在兩個 OpenAccessLinqDataSource 控制項的 Selected 事件上,把監聽的結果輸出到 lblLog 控制項上,看看 OpenAccessLinqDataSource 會執行那些 Sql Script。

接下來,我們設定 oasrcCustomers 控制項的資料來源,實體集指定 Customers,勾選幾個代表性的欄位:

184021

然後切換到【Where】頁籤,指定 COUNTRY 屬性要依 ddlCountry 的值來做過濾:

184125

按【Finish】鈕後,最後兩個動作,一個就是設定 gvList 的資料來源,當然就是 oasrcCustomers 控制項囉:

184347

另一個動作,就是設定 ddlCountry 的資料來源為 oasrcCountry:

190343

現在可以看看執行結果囉:

CC10-16-2013-2

Gif 圖檔位置:http://i.minus.com/ibf82JIwccOgQC.Gif

下面是完成的 FilteringData.aspx 程式碼:

<%@ Register assembly="Telerik.OpenAccess.Web.40" namespace="Telerik.OpenAccess.Web" tagprefix="telerik" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>過濾資料</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>    
        國家:<asp:DropDownList ID="ddlCountry" runat="server" AutoPostBack="True" DataSourceID="oasrcCountry" DataTextField="COUNTRY" DataValueField="COUNTRY">
        </asp:DropDownList>
        <br />
        <asp:GridView ID="gvList" runat="server" AutoGenerateColumns="False" DataSourceID="oasrcCustomers">
            <Columns>
                <asp:BoundField DataField="COMPANYNAME" HeaderText="COMPANYNAME" ReadOnly="True" SortExpression="COMPANYNAME" />
                <asp:BoundField DataField="CONTACTNAME" HeaderText="CONTACTNAME" ReadOnly="True" SortExpression="CONTACTNAME" />
                <asp:BoundField DataField="COUNTRY" HeaderText="COUNTRY" ReadOnly="True" SortExpression="COUNTRY" />
                <asp:BoundField DataField="CUSTOMERID" HeaderText="CUSTOMERID" ReadOnly="True" SortExpression="CUSTOMERID" />
            </Columns>
        </asp:GridView>
        <telerik:OpenAccessLinqDataSource ID="oasrcCountry" Runat="server" ContextTypeName="OALinqDataSourceWeb01.NWModel" EntityTypeName="" ResourceSetName="Customers" Select="new (COUNTRY)" />
        <telerik:OpenAccessLinqDataSource ID="oasrcCustomers" Runat="server" ContextTypeName="OALinqDataSourceWeb01.NWModel" EntityTypeName="" ResourceSetName="Customers" Select="new (COMPANYNAME, CONTACTNAME, COUNTRY, CUSTOMERID)" Where="COUNTRY == @COUNTRY" >
            <WhereParameters>
                <asp:ControlParameter ControlID="ddlCountry" DefaultValue="" Name="COUNTRY" PropertyName="SelectedValue" Type="String" />
            </WhereParameters>
        </telerik:OpenAccessLinqDataSource>
        <asp:Label ID="lblLog" runat="server" />
    </div>
    </form>
</body>
</html>

--------
沒什麼特別的~
不過是一些筆記而已