【问题标题】:Expression Trees in Linq To EntitiesLinq To 实体中的表达式树
【发布时间】:2012-03-02 10:15:04
【问题描述】:

我正在尝试创建一个扩展方法,该方法接受一个指向实体上的属性的表达式,以及一个常量字符串以将其与使用String.Contains 进行比较,首先检查字符串是空还是空,并且仅当字符串具有值时才应用过滤器。这是我第一次涉足表达式树,所以我不太确定发生了什么,我现在有一个例外,我不知道如何治愈......

我目前为止:

<System.Runtime.CompilerServices.Extension()>
    Public Function CheckAndFilter(Of T)(source As System.Linq.IQueryable(Of T), expressionField As System.Linq.Expressions.Expression(Of System.Func(Of T, String)), compareTo As String) As IQueryable(Of T)


        If String.IsNullOrEmpty(compareTo) Then
            Return source
        Else
            Dim memberExp As Expressions.MemberExpression = DirectCast(expressionField.Body, Expressions.MemberExpression)

            Dim param = Expressions.Expression.Parameter(GetType(T))
            Dim method As Reflection.MethodInfo = GetType(String).GetMethod("Contains")

            Dim compareToExpression = Expressions.Expression.Constant(compareTo)
            Dim finalExpr = Expressions.Expression.Call(memberExp, method, compareToExpression)

            Dim lambda = Expressions.Expression.Lambda(Of Func(Of T, Boolean))(finalExpr, param)
            Return source.Where(lambda)
        End If
    End Function

我这样称呼它,针对DbContext,我有一个Customer 实体和FirstName 字符串属性:

Dim results = repository.Customers.CheckAndFilter(Function(c) c.FirstName, searchText)

例外是:

{"The parameter 'c' was not bound in the specified LINQ to Entities query expression."}

有什么想法吗?

【问题讨论】:

    标签: linq entity-framework lambda linq-to-entities linq-expressions


    【解决方案1】:

    哈哈!

    这是因为我声明了一个新参数,而不是重新使用通过表达式传入的参数...

    <System.Runtime.CompilerServices.Extension()>
    Public Function CheckAndFilter(Of T)(source As System.Linq.IQueryable(Of T), expressionField As System.Linq.Expressions.Expression(Of System.Func(Of T, String)), compareTo As String) As IQueryable(Of T)
    
    
        If String.IsNullOrEmpty(compareTo) Then
            Return source
        Else
            Dim memberExp As Expressions.MemberExpression = DirectCast(expressionField.Body, Expressions.MemberExpression)
    
            Dim method As Reflection.MethodInfo = GetType(String).GetMethod("Contains")
    
            Dim compareToExpression = Expressions.Expression.Constant(compareTo)
            Dim finalExpr = Expressions.Expression.Call(memberExp, method, compareToExpression)
    
            Dim lambda = Expressions.Expression.Lambda(Of Func(Of T, Boolean))(finalExpr, expressionField.Parameters)
            Return source.Where(lambda)
        End If
    End Function
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多