透过自定义Function当作LINQ的Where条件(多重条件筛选)范例与动态教学

本文主要是介绍透过自定义Function当作LINQ的Where条件(多重条件筛选)范例与动态教学,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 以往为了让用户筛选资料的时候可以灵活应用,会在画面上每个条件前面加个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   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试试看....透过这个过程可以了解

  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的使用者。

 

转载于:https://www.cnblogs.com/topcat/archive/2008/06/08/1215819.html

这篇关于透过自定义Function当作LINQ的Where条件(多重条件筛选)范例与动态教学的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/541222

相关文章

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

多重背包转换成0-1背包

http://acm.hdu.edu.cn/showproblem.php?pid=2191 多重背包特点: 一种物品有C个(既不是固定的1个,也不是无数个) 优化的方法: 运用神奇的二进制,进行物品拆分,转化成01背包 物品拆分,把13个相同的物品分成4组(1,2,4,6) 用这4组可以组成任意一个1~13之间的数! 原理:一个数总可以用2^

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla

AutoGen Function Call 函数调用解析(一)

目录 一、AutoGen Function Call 1.1 register_for_llm 注册调用 1.2 register_for_execution 注册执行 1.3 三种注册方法 1.3.1 函数定义和注册分开 1.3.2 定义函数时注册 1.3.3  register_function 函数注册 二、实例 本文主要对 AutoGen Function Call