以往为了让用户筛选资料的时候可以灵活应用,会在画面上每个条件前面加个CheckBox,让使用者可以自由勾选要筛选的字段并设定条件,如下图:
这样的方式在以往数据源是SQL的时候,可以透过判断式、加上组合SQL字符串的方式达到,但是在Linq里面要怎么处理呢??
小喵再练习Linq的过程中,想到了这个问题...刚好康廷数位的吕高旭老师MSN过来与小喵聊到要写LINQ书籍的计划,小喵于是向吕老师请教了这方面的问题...
小喵做了一个教学动画,透过自己写的一个Function来当作筛选的条件,相关内容请点选以下的超链结:
透过自定义Function当作LINQ的Where条件
相关的画面程序代码如下:
< 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的使用者。