C# でデータを扱う際によく登場する IEnumerable
と IQueryable
。どちらもコレクションを列挙するための仕組みですが、処理の実行タイミングや適した用途に違いがあります。本記事では両者の特徴を整理し、使い分けのポイントを解説します。
IEnumerableとは
IEnumerable<T>
はメモリ上のコレクションを列挙するためのインターフェースです。C# の foreach
文で利用できるすべてのコレクション(配列、リストなど)は IEnumerable
を実装しています。
IEnumerable<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
foreach (var n in numbers)
{
Console.WriteLine(n);
}
特徴:
- LINQ to Objects(メモリ上のデータ処理)で利用される
- すべての処理はアプリケーション側(C#)で実行される
- 小規模データや既にメモリに読み込まれているデータに適している
IQueryableとは
IQueryable<T>
は IEnumerable
を継承しつつ、さらに式ツリーを使ってクエリを表現する仕組みを持っています。LINQ to SQL や Entity Framework など、データベースへのクエリを構築する際に利用されます。
IQueryable<User> query = dbContext.Users
.Where(u => u.IsActive)
.OrderBy(u => u.Name);
var result = query.ToList(); // SQL に変換され、DB で実行
特徴:
- LINQ to SQL / Entity Framework で利用される
- 処理はデータベース側で実行される
- 大量データの効率的な取得やフィルタリングに適している
両者の比較
項目 | IEnumerable | IQueryable |
---|---|---|
処理場所 | メモリ上(C# 側) | データベースや外部ソース |
遅延実行 | 可能(LINQ to Objects) | 可能(SQL に変換される) |
適したデータ | 小規模・メモリ上のデータ | 大量・外部データベースのデータ |
変換方法 | 処理は .NET のメソッドとして実行 | 式ツリーに変換され、SQL などに変換 |
使い分けのポイント
- 小規模なデータ(例: 配列、リストなど) →
IEnumerable
- 大量のデータやデータベースアクセス →
IQueryable
IQueryable
でデータベースに問い合わせ、結果を取得した後はIEnumerable
としてメモリ上でさらに処理する、という組み合わせも一般的
まとめ
IEnumerable
は「メモリ上のデータを扱う」ための仕組み、IQueryable
は「外部データソースにクエリを発行する」ための仕組みです。
処理対象のデータがどこにあるか(メモリか、データベースか)を基準に選び、適切に使い分けることで効率的なデータ処理が可能になります。