小喵做了一個教學動畫,透過自己寫的一個Function來當作篩選的條件,相關內容..
以往為了讓使用者篩選資料的時候可以靈活應用,會在畫面上每個條件前面加個CheckBox,讓使用者可以自由勾選要篩選的欄位並設定條件,如下圖:
這樣的方式在以往資料來源是SQL的時候,可以透過判斷式、加上組合SQL字串的方式達到,但是在Linq裡面要怎麼處理呢??
小喵再練習Linq的過程中,想到了這個問題...剛好康廷數位的呂高旭老師MSN過來與小喵聊到要寫LINQ書籍的計畫,小喵於是向呂老師請教了這方面的問題...
小喵做了一個教學動畫,透過自己寫的一個Function來當作篩選的條件,相關內容請點選以下的超鏈結:
相關的畫面程式碼如下:
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的內容如下:
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 |