1

問題の説明

私のアプリケーションでは、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パラメーター) があるため、毎回式を作成してコンパイルする必要があり、非常に非効率的な方法になります (間違っている場合は修正してください)。

  • 単一のエンティティをIQueriableusingでラップnew [] { myEntity }.AsQueriable()し、クエリを評価できます。これがどれほどうまく機能するかはわかりません。

質問:

  • 上記のアプローチのどれがより高速ですか?
  • (制限に関する)私の仮定のいずれかが間違っていますか?
  • 私がまだ考えていない他の方法はありますか?
4

1 に答える 1