IQueryable<T>
返却との違いは何ですかIEnumerable<T>
。どちらを優先すべきでしょうか。
IQueryable<Customer> custs = from c in db.Customers
where c.City == "<City>"
select c;
IEnumerable<Customer> custs = from c in db.Customers
where c.City == "<City>"
select c;
両方とも実行が延期されますか? また、どちらが優先されるべきでしょうか?
ベストアンサー1
はい、どちらもあなたに延期実行。
違いはIQueryable<T>
LINQ-to-SQL(LINQ.-to-anything)が機能するためのインターフェースです。IQueryable<T>
、可能であればそのクエリはデータベース内で実行されます。
のためにIEnumerable<T>
この場合、LINQ-to-object となり、元のクエリに一致するすべてのオブジェクトをデータベースからメモリに読み込む必要があります。
コードでは:
IQueryable<Customer> custs = ...;
// Later on...
var goldCustomers = custs.Where(c => c.IsGold);
このコードは、SQL を実行してゴールド カスタマーのみを選択します。一方、次のコードは、データベースで元のクエリを実行し、メモリ内のゴールド以外のカスタマーをフィルター処理します。
IEnumerable<Customer> custs = ...;
// Later on...
var goldCustomers = custs.Where(c => c.IsGold);
これは非常に重要な違いであり、IQueryable<T>
多くの場合、データベースから返される行数が多くなりすぎるのを防ぐことができます。もう1つの代表的な例はページングです。Take
そしてSkip
の上IQueryable
要求された行数だけ取得されます。IEnumerable<T>
すべての行がメモリにロードされます。