VB.net中动态构建Linq的Where子句

Imports System.Linq.Expressions
Imports System.Linq
Imports System.Collections.Generic
Class A
    Public Property Name As String
    Public Property ID As Integer
    Public Overrides Function ToString() As String
        Return ID & "," & Name
    End Function
End Class
Module Module1
    Function MyWhere(Of T)(ByVal data As IEnumerable(Of T), ByVal propname As String, ByVal value As Object) As IEnumerable(Of T)
        Dim param = Expression.Parameter(GetType(T), "x")
        Dim body = Expression.Equal(Expression.MakeMemberAccess(param, GetType(T).GetProperty(propname)), Expression.Constant(value))
        Dim lambdaexpr As Object = Expression.Lambda(body, param).Compile()
        Return data.Where(CType(lambdaexpr, Func(Of T, Boolean)))
    End Function
    Sub Main()
        Dim list As New List(Of A)
        list.Add(New A() With {.ID = 1, .Name = "a"})
        list.Add(New A() With {.ID = 2, .Name = "b"})
        list.Add(New A() With {.ID = 3, .Name = "c"})
        Console.WriteLine(MyWhere(list, "Name", "a").First())
        Console.WriteLine(MyWhere(list, "ID", 2).First())
    End Sub
End Module
'''如果是linq to sql/ef,可以用下面的:
Imports System.Linq.Expressions
Imports System.Linq
Imports System.Collections.Generic
Class A
    Public Property Name As String
    Public Property ID As Integer
    Public Overrides Function ToString() As String
        Return ID & "," & Name
    End Function
End Class
Module Module1
    Function MyWhere(Of T)(ByVal data As IQueryable(Of T), ByVal propname As String, ByVal value As Object) As IQueryable(Of T)
        Dim param = Expression.Parameter(GetType(T), "x")
        Dim body = Expression.Equal(Expression.MakeMemberAccess(param, GetType(T).GetProperty(propname)), Expression.Constant(value))
        Dim lambdaexpr As Object = Expression.Lambda(body, param)
        Return data.Where(CType(lambdaexpr, Expression(Of Func(Of T, Boolean))))
    End Function
    Sub Main()
        Dim list As New List(Of A)
        list.Add(New A() With {.ID = 1, .Name = "a"})
        list.Add(New A() With {.ID = 2, .Name = "b"})
        list.Add(New A() With {.ID = 3, .Name = "c"})
        Console.WriteLine(MyWhere(list.AsQueryable(), "Name", "a").First())
        Console.WriteLine(MyWhere(list.AsQueryable(), "ID", 2).First())
    End Sub
End Module
(0)

相关推荐

  • C# LINQ学习笔记三:LINQ to OBJECT之操作字符串

    一.统计单词在字符串中出现的次数 请注意,若要执行计数,请先调用Split方法来创建词数组.Split方法存在性能开销,如果对字符串执行的唯一操作是计数词,则应考虑改用Matches或 IndexOf ...

  • 如何在vb程序中实现对access数据库的msysobjects表的读取操作?

    各种基于SEIR模型的改进算法代码.Python代码,还包含Si,sir,sis的代码,是做数学建模比赛整理的资料,具全,带论文.研究COVID-19的传播过程和受感染人数的变化规律,是探索如何制止C ...

  • 简述资源估算中动态椭球体的重要性

    简述资源估算中动态椭球体的重要性 作者:刘金辉博士 主任咨询师(地质) 矿产资源评价中,资源估算和分类的合理性是评价矿产项目至关重要的方面.而在资源估算中搜索椭球体是非常重要的一个基础参数,该参数直接 ...

  • CentOS系统中动态调整LVM分区大小

    接上一篇文档,介绍了非LVM情况下压缩/根分区磁盘容量的操作 CentOS6下压缩/根分区磁盘容量的操作说明 那如何在LVM分区下实现动态调整分区大小呢,如下图所示 LVM分了三个区分别为/bak,/ ...

  • 中国将构建新型电力系统,三主线布局投资机会丨牛熊眼

    日前,国家能源局局长章建华在国际能源署-第26届联合国气候变化大会净零排放视频峰会上表示,中国下一步将大力发展非化石能源,构建以新能源为主体的新型电力系统,推动绿色低碳技术实现重大突破. 招商证券指出 ...

  • 产业园区规划中如何构建立体化的园区空间

    东滩智库隆重推出 新经济产业领域系列<产业内参> 关注 产业园区的空间体系可以解构为三个层次,即物理空间.虚拟空间和文化空间.其中,物理空间是园区发展必不可少的因素,在物理空间之上融合虚拟 ...

  • 立体几何中动态最值问题选题解析

    立体几何中的最值问题常以哪些思路进行分析?既然有最值,则就有未知的数值,这种数值若从函数角度分析可能是某条未知的线段,某个未知的角度,若从几何的角度分析,可能是某个点的特定位置,或类似于蚂蚁爬盒子之类 ...

  • VB.NET中操作xml文件

    已知有一个XML文件(bookstore.xml)如下: <?xml version="1.0" encoding="gb2312"?> <b ...

  • 数商云为中大型企业构建高效、科学的采购管理系统平台

    伴随着供应链发展趋势越发激烈,各中大型企业的市场竞争也愈发重视以优化供应链体系.企业采购系统管理体制等采购模式,在经济全球化.信息化的市场竞争背景下,企业采购平台优化供应链管理运营模式也必将成为最终趋 ...

  • 在LR中动态拼接参数的问题

    在很多时候系统是提供了多选并且组合提交的操作,这个时候请求就需要动态拼接了,这里举个参考的例子给大家,希望能够让大家明白怎么回事. 比如这里有一个ID列表,通过关联可以拿到对应的所有编号 注意这里的参 ...