少しクリーンアップするために、拡張メソッドで繰り返しコードをラップしようとしています。
私が避けようとしているパターンは、文字列(通常はコントロールのテキスト値)がnull /空であるかどうかをチェックし、そうである場合は、Containsを使用してデータのフィールドと比較することです。明らかに、フィールドは私の拡張機能にハードコードされておらず、オブジェクトタイプもハードコードされていません。
私が持っているものはLinqtoObjectsで完全に機能しますが、一般的なランタイムエラー「LINQtoEntitiesはメソッド'System.String Invoke(GenericQueryHelper.Customer)'メソッドを認識しません。このメソッドはに変換できません。ストア式。」エンティティフレームワークモデルを使用する場合。
これが私が持っているものです:
<System.Runtime.CompilerServices.Extension()>
Public Function CompareAndFilter(Of T)(source As System.Linq.IQueryable(Of T), expressionField As System.Linq.Expressions.Expression(Of System.Func(Of T, String)), compareTo As String)
If String.IsNullOrEmpty(compareTo) Then
Return source
Else
Dim compiledField As System.Func(Of T, String) = expressionField.Compile()
Return source.Where(Function(x) compiledField.Invoke(x).Contains(compareTo))
End If
End Function
そして私も試しました:
<System.Runtime.CompilerServices.Extension()>
Public Function CompareAndFilter(Of T)(source As System.Linq.IQueryable(Of T), expressionField As System.Func(Of T, String), compareTo As String)
If String.IsNullOrEmpty(compareTo) Then
Return source
Else
Return source.Where(Function(x) expressionField.Invoke(x).Contains(compareTo))
End If
End Function
同じ結果で...
まず、これも可能ですか?使用法を次のようにしたいと思います。
Dim results = repository.Customers.CompareAndFilter(Function(c) c.FirstName, searchText)
結果をフィルタリングしているので、SQLデータベースに対してこれを実行する必要があります。そのため、メモリ内で実行したくありません。誰か考えはありますか?