透過自訂Function當作LINQ的Where條件(多重條件篩選)範例與動態教學

小喵做了一個教學動畫,透過自己寫的一個Function來當作篩選的條件,相關內容..

以往為了讓使用者篩選資料的時候可以靈活應用,會在畫面上每個條件前面加個CheckBox,讓使用者可以自由勾選要篩選的欄位並設定條件,如下圖:

這樣的方式在以往資料來源是SQL的時候,可以透過判斷式、加上組合SQL字串的方式達到,但是在Linq裡面要怎麼處理呢??

小喵再練習Linq的過程中,想到了這個問題...剛好康廷數位的呂高旭老師MSN過來與小喵聊到要寫LINQ書籍的計畫,小喵於是向呂老師請教了這方面的問題...

小喵做了一個教學動畫,透過自己寫的一個Function來當作篩選的條件,相關內容請點選以下的超鏈結:

透過自訂Function當作LINQ的Where條件

相關的畫面程式碼如下:

01         資料夾:<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的內容如下:

01     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試試看....透過這個過程可以了解

  1. Linq運作的時機
  2. 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的使用者。

 


以下是簽名:


Microsoft MVP
Visual Studio and Development Technologies
(2005~2019/6) 
topcat
Blog:http://www.dotblogs.com.tw/topcat