IQueryable
LINQ のコンテキストでは は何に使用されますか?
拡張メソッドの開発やその他の目的に使用されますか?
ベストアンサー1
マーク・グラヴェルの回答非常に完成度が高いのですが、ユーザーの視点からもこれについて何か付け加えておきたいと思います...
ユーザーの観点から見た主な違いは、IQueryable<T>
(適切にサポートするプロバイダーと)使用すると、多くのリソースを節約できることです。
たとえば、多くの ORM システムでリモート データベースに対して作業している場合、テーブルからデータを取得する方法は 2 つあります。1 つは を返しIEnumerable<T>
、もう 1 つは を返しますIQueryable<T>
。たとえば、Products テーブルがあり、コストが 25 ドルを超えるすべての製品を取得するとします。
もし、するなら:
IEnumerable<Product> products = myORM.GetProducts();
var productsOver25 = products.Where(p => p.Cost >= 25.00);
ここで何が起きるかというと、データベースがすべての製品を読み込み、それを回線経由でプログラムに渡します。その後、プログラムがデータをフィルタリングします。本質的には、データベースが を実行しSELECT * FROM Products
、すべての製品を返します。
IQueryable<T>
一方、適切なプロバイダーを利用すれば、次のことが可能になります。
IQueryable<Product> products = myORM.GetQueryableProducts();
var productsOver25 = products.Where(p => p.Cost >= 25.00);
コードは同じに見えますが、ここでの違いは、実行される SQL が になることですSELECT * FROM Products WHERE Cost >= 25
。
開発者の観点から見ると、これは同じように見えます。ただし、パフォーマンスの観点からは、ネットワーク全体で 20,000 件ではなく 2 件のレコードしか返されない可能性があります。