1

엔티티의 속성을 가리키는 표현식을 사용하는 확장 메소드를 만들고, 문자열이 있는지를 먼저 확인하는 String.Contains을 사용하여 이것을 비교하는 상수 문자열을 만들려고합니다. null 또는 공백을 반환하고 문자열에 값이있는 경우에만 필터를 적용합니다. 이것은 표현식 트리의 첫 번째 실수입니다. 그래서 무슨 일이 일어나고 있는지 잘 모르겠습니다. 이제 저는 치료 방법을 모르겠다는 예외가 있습니다.엔티티에 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