以往为了让用户筛选资料的时候可以灵活应用,会在画面上每个条件前面加个CheckBox,让使用者可以自由勾选要筛选的字段并设定条件,如下图:
这样的方式在以往数据源是SQL的时候,可以透过判断式、加上组合SQL字符串的方式达到,但是在Linq里面要怎么处理呢??
小喵再练习Linq的过程中,想到了这个问题...刚好康廷数位的吕高旭老师MSN过来与小喵聊到要写LINQ书籍的计划,小喵于是向吕老师请教了这方面的问题...
小喵做了一个教学动画,透过自己写的一个Function来当作筛选的条件,相关内容请点选以下的超链结:
相关的画面程序代码如下:
<asp:Button ID="btnGetFiles" runat="server" Text="取得档案信息" />
<br />
讯息:<asp:Label ID="lblMsg" runat="server" Text="" ForeColor="Red" Font-Bold="True"></asp:Label>
<hr />
<table>
<tr>
<td valign="top">
筛选条件:<br />
<asp:CheckBox ID="chkExten" runat="server" Text="扩展名:" />
<asp:DropDownList ID="ddlExten" runat="server">
</asp:DropDownList><br />
<asp:CheckBox ID="chkFileName" runat="server" Text="檔名包含:" />
<asp:TextBox ID="txtFileName" runat="server"></asp:TextBox><br />
<asp:Button ID="btnQry" runat="server" Text="筛选" /><br />
<asp:Button ID="btnQryFunc" runat="server" Text="透过Function筛选" />
</td>
<td>
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
</td>
</tr>
</table>
CodeFile的内容如下:
Protected Sub Page_Load() Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
myFiles = ViewState("myFiles")
If myFiles Is Nothing Then
myFiles = New List(Of FileInfo)
End If
End Sub
Protected Sub btnGetFiles_Click() Sub btnGetFiles_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGetFiles.Click
myFiles.Clear()
For Each FileName As String In My.Computer.FileSystem.GetFiles(Me.txtDir.Text)
'取得FileInfo並放入myFiles
myFiles.Add(My.Computer.FileSystem.GetFileInfo(FileName))
Next
ViewState("myFiles") = myFiles
Me.GridView1.DataSource = myFiles
Me.GridView1.DataBind()
Me.ddlExten.DataSource = myFiles
Me.ddlExten.DataTextField = "Extension"
Me.ddlExten.DataValueField = "Extension"
Me.ddlExten.DataBind()
End Sub
Protected Sub btnQry_Click() Sub btnQry_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnQry.Click
Dim o = From FI In myFiles _
Where FI.Extension = Me.ddlExten.SelectedValue And FI.Name Like "*" & Me.txtFileName.Text & "*" _
Select FI
Me.GridView1.DataSource = o
Me.GridView1.DataBind()
End Sub
Protected Sub btnQryFunc_Click() Sub btnQryFunc_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnQryFunc.Click
'Dim o = From FI In myFiles _
Try
Dim o = From FI In myFiles _
Where ChkFile(FI) _
Select FI
Me.GridView1.DataSource = o
Me.GridView1.DataBind()
Catch ex As Exception
Me.lblMsg.Text = ex.Message
End Try
End Sub
Private Function ChkFile() Function ChkFile(ByVal FI As FileInfo) As Boolean
Dim rc As Boolean = True
Try
If Me.chkExten.Checked Then
Dim rcExten As Boolean = True
If Not FI.Extension = Me.ddlExten.SelectedValue Then
rcExten = False
End If
rc = rc And rcExten
End If
If Me.chkFileName.Checked Then
Dim rcFN As Boolean = True
If InStr(1, FI.Name, Me.txtFileName.Text, CompareMethod.Text) = 0 Then
rcFN = False
End If
rc = rc And rcFN
End If
Return rc
Catch ex As Exception
Throw New Exception(ex.Message)
End Try
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的使用者。
![]() Microsoft MVP ASP/ASP.NET |
![]() topcat |