は、私は頻繁に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で実行できるようにするにはどうすればよいですか?
ありがとうございます!それがうまくいって、表現を使って作業することについて多くのことを学びました。 –