IEnumerable を返す IQueryable と比較 質問する

IEnumerable を返す IQueryable と比較 質問する

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>すべての行がメモリにロードされます。

おすすめ記事