小喵做了一個教學動畫,透過自己寫的一個Function來當作篩選的條件,相關內容..
以往為了讓使用者篩選資料的時候可以靈活應用,會在畫面上每個條件前面加個CheckBox,讓使用者可以自由勾選要篩選的欄位並設定條件,如下圖:

這樣的方式在以往資料來源是SQL的時候,可以透過判斷式、加上組合SQL字串的方式達到,但是在Linq裡面要怎麼處理呢??
小喵再練習Linq的過程中,想到了這個問題...剛好康廷數位的呂高旭老師MSN過來與小喵聊到要寫LINQ書籍的計畫,小喵於是向呂老師請教了這方面的問題...
小喵做了一個教學動畫,透過自己寫的一個Function來當作篩選的條件,相關內容請點選以下的超鏈結:
相關的畫面程式碼如下:
        資料夾:<asp:TextBox ID="txtDir" runat="server"></asp:TextBox> 02
        <asp:Button ID="btnGetFiles" runat="server" Text="取得檔案資訊" /> 03
        <br /> 04
        訊息:<asp:Label ID="lblMsg" runat="server" Text="" ForeColor="Red" Font-Bold="True"></asp:Label> 05
        <hr /> 06
        <table> 07
            <tr> 08
                <td valign="top"> 09
                    篩選條件:<br /> 10
                    <asp:CheckBox ID="chkExten" runat="server" Text="副檔名:" /> 11
                    <asp:DropDownList ID="ddlExten" runat="server"> 12
                    </asp:DropDownList><br /> 13
                    <asp:CheckBox ID="chkFileName" runat="server" Text="檔名包含:" /> 14
                    <asp:TextBox ID="txtFileName" runat="server"></asp:TextBox><br /> 15
                    <asp:Button ID="btnQry" runat="server" Text="篩選" /><br /> 16
                    <asp:Button ID="btnQryFunc" runat="server" Text="透過Function篩選" /> 17
                     18
                </td> 19
                <td> 20
                    <asp:GridView ID="GridView1" runat="server"> 21
                    </asp:GridView> 22
                </td> 23
            </tr> 24
        </table>CodeFile的內容如下:
    Dim myFiles As List(Of FileInfo) 02
 03
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 04
        myFiles = ViewState("myFiles") 05
        If myFiles Is Nothing Then 06
            myFiles = New List(Of FileInfo) 07
        End If 08
 09
    End Sub 10
 11
    Protected Sub btnGetFiles_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGetFiles.Click 12
        myFiles.Clear() 13
 14
        For Each FileName As String In My.Computer.FileSystem.GetFiles(Me.txtDir.Text) 15
            '取得FileInfo並放入myFiles 16
            myFiles.Add(My.Computer.FileSystem.GetFileInfo(FileName)) 17
        Next 18
 19
        ViewState("myFiles") = myFiles 20
 21
        Me.GridView1.DataSource = myFiles 22
        Me.GridView1.DataBind() 23
 24
        Me.ddlExten.DataSource = myFiles 25
        Me.ddlExten.DataTextField = "Extension" 26
        Me.ddlExten.DataValueField = "Extension" 27
        Me.ddlExten.DataBind() 28
 29
    End Sub 30
 31
    Protected Sub btnQry_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnQry.Click 32
        Dim o = From FI In myFiles _ 33
                Where FI.Extension = Me.ddlExten.SelectedValue And FI.Name Like "*" & Me.txtFileName.Text & "*" _ 34
                Select FI 35
        Me.GridView1.DataSource = o 36
        Me.GridView1.DataBind() 37
    End Sub 38
 39
    Protected Sub btnQryFunc_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnQryFunc.Click 40
        'Dim o = From FI In myFiles _ 41
        Try 42
            Dim o = From FI In myFiles _ 43
                    Where ChkFile(FI) _ 44
                    Select FI 45
            Me.GridView1.DataSource = o 46
            Me.GridView1.DataBind() 47
 48
 49
        Catch ex As Exception 50
            Me.lblMsg.Text = ex.Message 51
        End Try 52
 53
    End Sub 54
 55
    Private Function ChkFile(ByVal FI As FileInfo) As Boolean 56
        Dim rc As Boolean = True 57
        Try 58
            If Me.chkExten.Checked Then 59
                Dim rcExten As Boolean = True 60
                If Not FI.Extension = Me.ddlExten.SelectedValue Then 61
                    rcExten = False 62
                End If 63
                rc = rc And rcExten 64
            End If 65
            If Me.chkFileName.Checked Then 66
                Dim rcFN As Boolean = True 67
                If InStr(1, FI.Name, Me.txtFileName.Text, CompareMethod.Text) = 0 Then 68
                    rcFN = False 69
                End If 70
                rc = rc And rcFN 71
            End If 72
            Return rc 73
 74
        Catch ex As Exception 75
            Throw New Exception(ex.Message) 76
        End Try 77
 78
    End Function要記得兩個Imports
Imports System.IO
Imports System.Linq
各位朋友可以自己實際的Step By Step試試看....透過這個過程可以了解
- Linq運作的時機
 - Linq運作的方式:關鍵在From FI In myFiles
 
創造無限可能的Linq應用
透過自訂Function的方式來下達Where,小喵的指是其中的一種應用,這樣的方是大大的提高了Linq的應用,試想各式的條件,本來沒有提供的判斷,都可以透過自己的Function解決。這讓Linq的活用能力從內定提供的方法,衍生到無限的可能(只要.NET Framework可以做的就可能)。
小喵舉個例子,例如有某個資料夾中存放了很多程式的Source Code,如果要找出這些Source Code的內容裡面,包含某幾個關鍵字,或者用到某個Function,這樣的問題一樣可以透過自定的Function來達到。
在此要特別感謝康廷數位呂高旭老師的幫忙,也在此強烈推薦呂老師的新書【LINQ最佳實務講座】,不過很可惜的是目前只會推出C#版本,由於LINQ在VB.NET與C#中的語法有蠻多地方不同,因此也期望呂老師能夠也出一本VB.NET的版本造廣大VB.NET的使用者。
以下是簽名:
- 歡迎轉貼本站的文章,不過請在貼文主旨上加上【轉貼】,並在文章中附上本篇的超連結與站名【topcat姍舞之間的極度凝聚】,感恩大家的配合。
 - 小喵大部分的文章會以小喵熟悉的語言VB.NET撰寫,如果您需要C#的Code,也許您可以試著用線上的工具進行轉換,這裡提供幾個參考
 
| Microsoft MVP Visual Studio and Development Technologies (2005~2019/6)  | topcat Blog:http://www.dotblogs.com.tw/topcat  | 
    Protected
    Protected