1

少しクリーンアップするために、拡張メソッドで繰り返しコードをラップしようとしています。

私が避けようとしているパターンは、文字列(通常はコントロールのテキスト値)が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データベースに対してこれを実行する必要があります。そのため、メモリ内で実行したくありません。誰か考えはありますか?

4

2 に答える 2

3

はい、可能ですが、の操作が必要です。与えられた式を解析して新しい基準式を自分で作成するか、LINQKitツリー走査を実行させることができます。

于 2012-02-28T21:15:11.693 に答える
2

エンティティへのLinqは、デリゲートを呼び出す方法を理解していません。生成するSQLを実行するための式が必要です。

以下はあなたが求めていることをすることができるかもしれません:

<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
        Return source.GroupBy(expressionField)
            .Where(Function(g) g.Key.Contains(compareTo))
            .SelectMany(Function(g) g)
    End If
End Function

GroupByで指定されたフィールドを選択するために使用されているexpressionField場合、キーがチェックされ、各グループのアイテムが返されます。

于 2012-02-28T21:18:40.353 に答える