1

エンティティのプロパティを指す式と、それを比較する定数文字列を取り入れて、String.Containsを使用して比較する拡張メソッドを作成しようとしています。 nullまたは空の場合は、文字列に値がある場合にのみフィルタを適用します。これはExpression Treesの最初のすごい話ですので、どういうことが起こっているのか分かりません。私は現在、どのように治療法がわからない例外があります...エンティティのLinqの式ツリー

私はこれまでこれを行っています:

<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 

は私がFirstName文字列プロパティを持つCustomerエンティティ持っDbContextに対して、このようにそれを呼んでいる:

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

と例外がある:

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

答えて

2

ハ!私は表現を経由して渡されたものを再使用するのではなく、新しいパラメータを宣言したので

それは...だ

<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 
関連する問題