エンティティのプロパティを指す式と、それを using と比較する定数文字列を取り込む拡張メソッドを作成しようとしています。これはString.Contains
、最初に文字列が null または空であるかどうかをチェックし、次の場合にのみフィルターを適用します。文字列には値があります。ただし、これは式ツリーに手を出すのは初めてなので、何が起こっているのかよくわかりません。また、現在、例外があり、それを修正する方法がわかりません...
私はこれまでのところ:
<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."}
何かご意見は?