1. ホーム
  2. c#

[解決済み] IEnumerable<T> と IQueryable<T> を比較する。

2022-03-17 22:07:02

質問

を返すのとどう違うのですか? IQueryable<T> vs. 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;

どちらも執行猶予になるのでしょうか、また、どのような場合にどちらを優先すべきなのでしょうか?

どのように解決するのですか?

はい、どちらもお渡しします。 遅延実行 .

という違いがあります。 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> は、多くの場合、データベースからあまりに多くの行を返さなくて済むようにします。もう一つの典型的な例は、ページングを行うことです。もし Take Skip について IQueryable の場合、要求された行数しか取得できません。 IEnumerable<T> を使用すると、すべての行がメモリに読み込まれることになります。