【C#】IEnumerableとIQueryableの違いと使い分け

【C#】IEnumerableとIQueryableの違いと使い分け C#

C# でデータを扱う際によく登場する IEnumerableIQueryable。どちらもコレクションを列挙するための仕組みですが、処理の実行タイミングや適した用途に違いがあります。本記事では両者の特徴を整理し、使い分けのポイントを解説します。

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 は「外部データソースにクエリを発行する」ための仕組みです。
処理対象のデータがどこにあるか(メモリか、データベースか)を基準に選び、適切に使い分けることで効率的なデータ処理が可能になります。