C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のIEnumerableとIQueryableの違いとは?徹底解説

C#でデータを扱う際、IEnumerableIQueryableはどちらも頻繁に登場するインターフェースですが、その動作には重要な違いがあります。特にLINQを使ってデータベースにアクセスする場合、どちらを選ぶかによってパフォーマンスが大きく変わることもあります。本記事では、両者の違いをわかりやすく解説します。

IEnumerableとIQueryableの主な違い

  • 名前空間: IEnumerableSystem.Collections名前空間に、IQueryableSystem.Linq名前空間に定義されています。
  • 列挙方向: どちらも前方参照(順方向)のコレクションです。
  • 遅延読み込み: IEnumerableは遅延読み込み(Lazy Loading)をサポートしていません。一方、IQueryableは遅延読み込みをサポートしています。
  • データベースクエリの実行方法: IEnumerableの場合、サーバー側でSELECTクエリを実行し、データを一旦クライアント側のメモリに読み込んでからフィルタリングを行います。IQueryableの場合は、フィルタ条件を含めたクエリ全体がサーバー側で実行されます。
  • 拡張メソッドの引数: IEnumerableの拡張メソッドは関数オブジェクト(デリゲート)を受け取ります。IQueryableの拡張メソッドは式オブジェクト、つまり式ツリー(Expression Tree)を受け取ります。

具体例で比較する

IEnumerableを使用した場合

dbContext dc = new dbContext();
IEnumerable<SocialMedia> list = dc.SocialMedias.Where(p => p.Name.StartsWith("T"));
list = list.Take<SocialMedia>(1);

上記コードに対して生成されるSQL文は以下の通りです。

SELECT [t0].[ID], [t0].[Name] FROM [SocialMedia] AS [t0]
WHERE [t0].[Name] LIKE @p0

IEnumerableでは、Whereによる絞り込みのみがSQLに変換され、Take(1)はメモリ上のデータに対して適用されます。つまり、条件に一致するすべてのデータがまずクライアント側に読み込まれることになります。

IQueryableを使用した場合

dbContext dc = new dbContext();
IQueryable<SocialMedia> list = dc.SocialMedias.Where(p => p.Name.StartsWith("T"));
list = list.Take<SocialMedia>(1);

上記コードに対して生成されるSQL文は以下の通りです。

SELECT top 1 [t0].[ID], [t0].[Name] FROM [SocialMedia] AS [t0]
WHERE [t0].[Name] LIKE @p0

IQueryableでは、WhereTake(1)の両方がSQL文に変換され、TOP 1句としてサーバー側で実行されます。これにより、必要な1件分のデータだけが取得されるため、転送量とメモリ使用量を大幅に削減できます。

使い分けのポイント

  • データベースやリモートデータソースへのクエリ: IQueryableを使用しましょう。フィルタリングやページングがSQLレベルで実行され、パフォーマンスが向上します。
  • メモリ内コレクション(Listなど)の操作: IEnumerableで十分です。シンプルで扱いやすいのが利点です。

このように、IEnumerableIQueryableは似た用途に使えますが、内部動作が大きく異なります。大量データを扱う場面では、IQueryableを選ぶことで不要なデータ読み込みを避け、アプリケーションの効率を高めることができます。

  1. DirectX11とDirectX12の違いを徹底解説!ゲーマーが知っておくべきポイント

    DirectXは、ソフトウェアがマルチメディアコンテンツを描画し、グラフィックハードウェアと通信するために使用されるAPI(アプリケーションプログラミングインターフェース)のコレクションです。DirectXの主要な構成要素であるDirect3Dは、ソフトウェアとグラフィックスハードウェア間の通信を担っています。ハードウェアは製品ごとに異なるため、標準化された関数や呼び出しのライブラリを通じてグラフィックカードと通信することで、ゲーム開発を大幅にスピードアップできます。これは「ハードウェア抽象化」と呼ばれ、APIの最も重要な役割となっています。車に例えてみましょう。1台の車の運転ができれば、ほぼ

  2. C#の配列とリスト(List)の違いとは?特徴と基本的な使い方を解説

    C#における配列(Array)とリスト(List<T>)は、どちらも複数のデータをまとめて扱うためのコレクションですが、その性質には重要な違いがあります。 配列とリストの主な違い 配列は、生成時にサイズが固定される、同じ型の要素を順番に格納するコレクションです。一度作成した後は要素数を変更できません。 一方、Listはジェネリックコレクションであり、要素の追加や削除に応じてサイズが自動的に拡張・縮小します。この柔軟性が最大の特徴です。 項目配列List<T> サイズ固定可変(動的) 要素の追加不可(再作成が必要)Addメソッドで可能 宣言方法型[] 変数名Lis