-4

ASP.NET Web API とリポジトリ パターンを使用します。
そして、where句を動的に追加したいと思います。お気に入り、

//controller
  static readonly ICustomerRepository repository = new CustomerRepository();
  //
 var result = repository.GetAll();

 if (form['name'] != null) result.Where( p => p.custName.Contains( form['name'].toString() ) );
 if (form['attribute1'] != null) result.Where( p => p.attribute1.Equals( form['attribute1'].toString() ) );
 return result;
//

IOが怖くないですか?

4

4 に答える 4

3

IOが怖くないですか?

あなたが何を意味するのかは本当に明確ではありませんが、クエリは実行しようとしたときにのみデータベースに送信されます。これはおそらく、メソッドを呼び出すコードの一部にあります。GetAllに対して 1 回、次に最初のWhere句に対して 1 回、次に 2 番目の句に対して 1 回実行するというわけではありませんWhere。からデータのフェッチを開始すると、すべてが単一のクエリにパッケージ化されますIQueryable<>

于 2012-08-30T10:01:07.353 に答える
0

複数のwhere句が必要な場合は、私が尋ねたこの質問を見てください: LinQクエリを組み合わせる

同様の問題がありました。クエリ画面を取得し、それに応じて結果を適用したかったのですが、得られた答えは必要なものにぴったりでした

于 2012-08-30T10:02:17.130 に答える
0

にアクセスする場合、メモリ キャッシングのセットアップがなければ、data-baseほとんど常にアクセスがあります。IOしたがって、それはあなたがどのように管理するかによって異なりますdata-base。しかし、一般に、data-baseは高パフォーマンス アクセスを実現するように調整されているため、大規模なアプリケーションを作成するまでは、個人的には、このような単純なクエリでの操作のオーバーヘッドIOについて心配することはありません。IO

クエリを最適化したい場合は、(たとえば) 1 つのクエリにすることで、これら 2 つのデータの関係を見つけてInnerJoinを作成できます。

于 2012-08-30T10:02:40.203 に答える
0

クエリは実際にデータを取得したときに実行されるため、データベースからすべてのレコードをフェッチすることなく条件をスタックできます。

ただし、結果を何かに代入する必要があります。そうしないと、式を作成して破棄するだけになります。

var result = repository.GetAll();

if (form['name'] != null) {
  result = result.Where( p => p.custName.Contains( form['name'].toString() ) );
}
if (form['attribute1'] != null) {
  result = result.Where( p => p.attribute1.Equals( form['attribute1'].toString() ) );
}
return result; // or return result.ToList();

を追加してメソッドの最後に実際のクエリを実行するToListか、メソッドを呼び出すコードによって実行される式を返すかを検討してください。

于 2012-08-30T10:06:44.960 に答える