2016-11-15 7 views
0

は、私は頻繁にEntity Frameworkの、文字列の値が指定されている場合、私は同じように、.Where句を追加するパターンをLINQで、渡って来る:私はこれをクリーンアップし、フィルタを繰り返し避けたかったLINQ-to-Entities Where式で、指定されたロジックでロジックを構築するにはどうすればよいですか?

IQueryable<Foo> query = Foos.AsQueryable() 
if (!string.IsNullOrWhitespace(nameFilter)) query = query.Where(x => x.Name == name); 
if (!string.IsNullOrWhitespace(addressFilter) != null) query = query.Where(x => x.Address == addressFilter); 
if (!string.IsNullOrWhitespace(cityFilter) != null) query = query.Where(x => x.City == cityFilter); 
// ... 

。私が代わりに私のコードを変更することができるように

public static IQueryable<T> WhereEqualIfSpecified<T>(
    this IQueryable<T> query, 
    Expression<Func<T, string>> fieldDelegate, 
    string filterValue) 
{ 
    return string.IsNullOrWhiteSpace(filterValue) 
     ? query 
     : query.Where(x => fieldDelegate(x) == filterValue); // not valid, see question below 
} 

:私は、私は拡張メソッドを作成することができると思った

IQueryable<Foo> query = Foos.AsQueryable() 
    .WhereEqualIfSpecified(x => x.Name, nameFilter) 
    .WhereEqualIfSpecified(x => x.Address, addressFilter) 
    .WhereEqualIfSpecified(x => x.City, cityFilter) 
    // ... 
; 

しかし、私は上記のWhereEqualIfSpecifiedの方法では、fieldDelegateがにコンパイルされなければならない、ことを見出しましたFunc()をエンティティソースに対して呼び出すと、元のコードでデータベース内で実行されるこれらのステップの実行が失われます。

文字列値を返すのではなく、fieldDelegateから新しいExpressionを作成する方法の最後のステップがありません。このアプローチは機能しますか? WhereEqualIfSpecifiedに必要なものをExpressionにして、後でLINQ-to-Entitiesで実行できるようにするにはどうすればよいですか?

答えて

2

ここでは、式を作成することを試みています。表現は、代議員とは異なり、作成するには少しトリッキーです。 Hereは、式の作成方法の1つの実装です。そのComposeメソッドを取得したら、拡張メソッドを次のように記述できます。

public static IQueryable<T> WhereEqualIfSpecified<T>(
    this IQueryable<T> query, 
    Expression<Func<T, string>> fieldExpression, 
    string filterValue) 
{ 
    return string.IsNullOrWhiteSpace(filterValue) 
     ? query 
     : query.Where(fieldExpression.Compose(value => value == filterValue); 
} 
+0

ありがとうございます!それがうまくいって、表現を使って作業することについて多くのことを学びました。 –

関連する問題