LINQ と ADO.NET
更新 : November 2007
今日、ビジネス アプリケーション開発者の多くは、2 つ (またはそれ以上) のプログラミング言語を使ってアプリケーションを開発しています。ビジネス ロジックやプレゼンテーション層には高級言語 (Visual C#、Visual Basic など) が、データベースとの対話にはクエリ言語 (Transact-SQL など) が使用されています。開発者は実質的に複数の言語に精通していることが要求され、開発環境における言語の不整合が生じる原因にもなっています。たとえば、データ アクセス API を使用してデータベースを照会するアプリケーションでは、クエリは文字列リテラルとして引用符で囲んで指定する必要があります。コンパイラはこのクエリ文字列を認識できないため、エラー (無効な構文、参照されている列または行が実際に存在するかどうかなど) のチェック機構が働きません。クエリ パラメータの型チェックや IntelliSense のサポートもありません。
統合言語クエリ (LINQ: Language-Integrated Query) により、開発者はアプリケーション コード内でプログラミング言語とクエリ言語を使い分けることなく、セット ベースのクエリを作成できます。インメモリのデータ構造、XML ドキュメント、SQL データベース、DataSet オブジェクトなど、列挙可能な各種データ ソース (つまり、IEnumerable インターフェイスを実装するデータ ソース) に対する LINQ クエリを作成できます。実装方法には違いがありますが、こうした列挙可能なデータ ソースはすべて同じ構文および言語構造を公開しています。クエリはプログラミング言語のみで作成できるため、コンパイラによる認識も検証もできない文字列リテラルとしてクエリ言語を記述する必要はありません。クエリをプログラミング言語に統合することにより、コンパイル時の型チェックや構文チェック、IntelliSense の使用などが可能となるため、Visual Studio プログラマは生産性を高めることができます。クエリのデバッグやエラーの修正に伴う手間は、これらの機能によって軽減されます。
LINQ to DataSet、LINQ to SQL、および LINQ to Entities という 3 つの別個の ADO.NET 統合言語クエリ (LINQ: Language-Integrated Query) テクノロジがあります。LINQ to DataSet は、DataSet に対する高度で最適化されたクエリの実行を可能にします。一方、LINQ to SQL は、SQL Server データベース スキーマに対して直接クエリを実行できるようにします。また、LINQ to Entities は エンティティ データ モデルをクエリできるようにします。
SQL テーブルのデータをメモリ内のオブジェクトに転送することは、面倒であるだけでなく間違いの基にもなります。LINQ to DataSet および LINQ to SQL で実装された LINQ プロバイダは、ソース データを IEnumerable ベースのオブジェクト コレクションに変換します。プログラマからは、クエリの実行時も更新時も常にデータが IEnumerable コレクションとして見えます。これらのコレクションに対するクエリを記述する際には、IntelliSense の機能を完全に利用できます。
次の図は、ADO.NET LINQ テクノロジが、高級プログラミング言語および LINQ 対応のデータ ソースとどのように関係しているかを簡単に表したものです。
以降のセクションで、LINQ to DataSet、LINQ to SQL、および LINQ to Entities について詳しく説明します。
LINQ to DataSet
DataSet は、ADO.NET の基礎である非接続型プログラミング モデルの重要な要素であり幅広く使用されています。LINQ to DataSet により、開発者は他の多くのデータ ソースで利用できる共通のクエリ作成メカニズムを使用しながら、より高度なクエリ機能を DataSet に組み込むことができます。詳細については、「LINQ to DataSet」を参照してください。
LINQ to SQL
LINQ to SQL は、概念モデルへのマッピングを必要としない開発者にとって有用なツールです。LINQ to SQL では、LINQ プログラミング モデルを既存のデータベース スキーマ上で直接利用できるようになります。開発者は、データを表現する .NET Framework クラスを、LINQ to SQL を使って生成できます。こうして生成されたクラスは、概念データ モデルではなく、直接データベースのテーブル、ビュー、ストアド プロシージャ、およびユーザー定義関数にマッピングされます。
LINQ to SQL では、開発者が、XML などのデータ ソースに加え、インメモリ コレクションや DataSet と同じ LINQ プログラミング パターンを使用して、ストレージ スキーマに対して直接コードを記述できます。詳細については、「LINQ to SQL」を参照してください。
LINQ to Entities
現在、大部分のアプリケーションがリレーショナル データベースの上位に記述されています。ある時点で、これらのアプリケーションにはリレーショナル形式で表されるデータと対話する必要が生じます。データベース スキーマはアプリケーションの構築に理想的であるとは限らず、アプリケーションの概念モデルはデータベースの論理モデルと同じではありません。エンティティ データ モデルは、アプリケーションがデータをオブジェクトとして操作するために特定のドメインのデータをモデル化するときに使用できる概念データ モデルです。詳細については、「ADO.NET Entity Framework」を参照してください。
エンティティ データ モデルを介して、リレーショナル データは .NET 環境でオブジェクトとして公開されます。このため、オブジェクト層は LINQ サポートの理想的なターゲットとなり、開発者はビジネス ロジックの構築に使用される言語のデータベースに対するクエリを作成できます。この機能を LINQ to Entities と呼びます。詳細については、「LINQ to Entities」を参照してください。