以往为了让用户筛选资料的时候可以灵活应用,会在画面上每个条件前面加个CheckBox,让使用者可以自由勾选要筛选的字段并设定条件,如下图:

 

这样的方式在以往数据源是SQL的时候,可以透过判断式、加上组合SQL字符串的方式达到,但是在Linq里面要怎么处理呢??

小喵再练习Linq的过程中,想到了这个问题...刚好康廷数位的吕高旭老师MSN过来与小喵聊到要写LINQ书籍的计划,小喵于是向吕老师请教了这方面的问题...

小喵做了一个教学动画,透过自己写的一个Function来当作筛选的条件,相关内容请点选以下的超链结:

透过自定义Function当作LINQWhere条件

相关的画面程序代码如下:

 

文件夹:<asp:TextBox ID="txtDir" runat="server"></asp:TextBox> 
<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的内容如下:

    Dim myFiles As List(Of FileInfo) 
    
Protected Sub Page_Load() Sub Page_Load(ByVal sender As ObjectByVal 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 ObjectByVal 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 ObjectByVal 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 ObjectByVal 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试试看....透过这个过程可以了解

  1. Linq运作的时机
  2. Linq运作的方式:关键在From FI In myFiles

 


创造无限可能的Linq应用

透过自定义Function的方式来下达Where,小喵的指是其中的一种应用,这样的方是大大的提高了Linq的应用,试想各式的条件,本来没有提供的判断,都可以透过自己的Function解决。这让Linq的活用能力从内定提供的方法,衍生到无限的可能(只要.NET Framework可以做的就可能)

小喵举个例子,例如有某个文件夹中存放了很多程序的Source Code,如果要找出这些Source Code的内容里面,包含某几个关键词,或者用到某个Function,这样的问题一样可以透过自定的Function来达到。 


在此要特别感谢康廷数位吕高旭老师的帮忙,也在此强烈推荐吕老师的新书【LINQ最佳实务讲座】,不过很可惜的是目前只会推出C#版本,由于LINQVB.NETC#中的语法有蛮多地方不同,因此也期望吕老师能够也出一本VB.NET的版本造广大VB.NET的使用者。

 

posted on 2008-06-08 00:01  topcat  阅读(1210)  评论(0编辑  收藏  举报