分享

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

 孙无者 2020-12-14
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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多