問題の説明
私のアプリケーションでは、EntityFramework オブジェクトの上にユーザー入力に基づいて複雑な検索クエリを作成DbSet
し、データベースに対して実行する検索関数があります。次のようなものです。
public static IQueryable<MyEntity> ApplySearchQuery(SearchSpec search, IQueryable<MyEntity> query)
{
if (search.Condition1.HasValue)
query = query.Where(e => e.SomeProperty == search.Condition1);
if (search.Condition2.HasValue)
query = query.Where(e => e.OtherProperty == search.Condition2);
....
}
これは、データベース側で非常にうまく機能します。今、私は手元にある単一のポイントに達しました。特定のエンティティがエンティティと一致するMyEntity
かどうかを確認したいと思います。SearchSpec
そして、潜在的に多数のSearchSpec
オブジェクトに対してこれを行う必要があるため、パフォーマンスが重要です。
また、式の重複は避けたいと思います。
これまでに私が考えたことは次のとおりです。
式を呼び出し
Expression.Compile()
てデリゲートに変換してから呼び出すことができます。しかし、パラメーター (search
パラメーター) があるため、毎回式を作成してコンパイルする必要があり、非常に非効率的な方法になります (間違っている場合は修正してください)。単一のエンティティを
IQueriable
usingでラップnew [] { myEntity }.AsQueriable()
し、クエリを評価できます。これがどれほどうまく機能するかはわかりません。
質問:
- 上記のアプローチのどれがより高速ですか?
- (制限に関する)私の仮定のいずれかが間違っていますか?
- 私がまだ考えていない他の方法はありますか?