ユーザーが自分の Web サイトのテーブルのインデックス ページに移動して検索機能を使用する場合、where 句を ienumerable または iqueryable に追加する必要があるのではないかと考えていました。どちらも実行できることはわかっていますが、どちらがより効率的で、カスタム検索文字列拡張を queryable に追加できますか?
4 に答える
IQueryable
そしてIEnumerable
「インターフェース」と呼ばれるものです。インターフェースは、実際のオブジェクトが応答できる API を定義しますが、実際の型(つまり、オブジェクトが実装するクラス) のある程度の可変性を許容します。型がインターフェイスを実装している限り、すべてが機能し、(ほとんどの場合) 型を別の型と交換できます (それらがすべて同じインターフェイスを実装している場合)。
そうは言っても、IQueryable
実際には の拡張でIEnumerable
あるため、ここで話している目的のために、それらは実質的に同じものです。つまり、データベースから返されたオブジェクト セットが にキャストされるIQueryable
かIEnumerable
;にキャストされるかは問題ではありません。いずれの場合も、クエリを実行する必要があることをどちらのインターフェイスも指示していないため、クエリはまだ実行されている場合と実行されていない場合があります。重要なのは、コード内でクエリを実行するようなことを行ったかどうかです。たとえば、リストへのキャスト ( .ToList()
) や結果セットの反復処理 ( for
、foreach
など) などです。カウントを実行すると、クエリを実行しますが、理由は少し異なります (SELECT の代わりに COUNT クエリをデータベースに発行します)。
教訓は、コードのどの部分が実際にクエリを実行するのかに注意を払い、その時点より前にクエリの変更が発生することを確認する必要があるということです。
IQueryable に追加すると、DB へのライブ接続の一部であるため、データベースに送信されるクエリに追加されます。
これを IEnumerable (IQueryable 型ではない) に追加すると、クエリの実行後にメモリ内でフィルタリングが行われます。
基になる IQueryable を扱っている場合、どちらの場合も、違いがあるとは思えません。ただし、期待どおりのクエリを実行していることを確認するために、結果のクエリを SQL プロファイラーで表示することをお勧めします。
念のため IQueryable に追加しますが、どちらもインターフェイスであるため、実際には問題にならない場合があります。IEnumerables が常に IQueryables である場合でも、データベースが結果を返した後ではなく、データベース上で実行されるクエリの利点が得られるはずです。