0

エンティティ フレームワークを使用しており、最大 3 つの変数を受け取ることができるメソッドを作成しています。

public SearchTable(int var1, int var2, int var3)

エンティティ フレームワークで where を実行できるようにしたいのですが、渡された変数に対してのみです。

したがって、3 つすべてが渡されると、次のようになります。

var results = entities.vw_ToSearch.Where(x => x.var1 == var1 && x.var2 == var2 && x.var3 == var3);

しかし、たとえば var2 が null として渡され、値がない場合は、var1 と var2 の場所のみを実行したいと考えています。

可能性ごとに異なる where ステートメントを作成してこれを書き始め、どれを使用するかを確認するために多数の if ステートメントを実行するつもりでしたが、私が考えていないこれを行うためのより良い方法があるようです。

何かご意見は?

4

3 に答える 3

1

述語を AND 処理しているため、次のロジックを適用できます。

IQueryable<vw_ToSearchItem> results = entities.vw_ToSearch;
if (x.var1.HasValue)
   results = results.Where(x => x.var1 == var1);
if (x.var2.HasValue)
   results = results.Where(x => x.var2 == var2);
if (x.var3.HasValue)
   results = results.Where(x => x.var3 == var3);

このアプローチの利点は、必要なフィルターのみをデータベースに渡し、各行で null 可能性チェックを実行する必要がないことです (確立されたインデックスを利用するのではなく、テーブル スキャンが発生する可能性があります)。ほとんどのパフォーマンスの問題と同様に、各アプローチの生成された実行計画を評価して、ニーズに最適なものを確認する必要があります。

于 2012-09-24T20:05:29.757 に答える
0
Where( x => x.var1==var1 &&
    (var2 == null || x.var2 == var2))

2つ以上の場合は「アドリビタム」を追加...

于 2012-09-24T19:56:24.067 に答える
0

1 つのオプションは、Dynamic LINQを使用することです。

于 2012-09-24T19:24:03.607 に答える