C# での LINQ の使用
更新 : 2007 年 11 月
アプリケーションが SQL データベースや XML ドキュメント内のデータを使用するのは、非常に一般的です。これまで、開発者は C# などの主要なプログラミング言語に加え、SQL や XQuery などのその他の言語を習得する必要がありました。統合言語クエリ (LINQ: Language-Integrated Query) では、C# 言語自体にクエリ機能が追加されました。これにより、個別のクエリ言語を習得しなくても、C# の知識とその他のキーワードや概念を組み合わせて使用することで、SQL データベース、ADO.NET データセット、XML ドキュメント、および IEnumerable インターフェイスを実装するすべての .NET コレクション クラスを照会できます。
LINQ の利点
使い慣れたクエリ作成構文。
構文エラーとタイプ セーフに対応したコンパイル時のチェック。
デバッガ サポートの強化。
IntelliSense のサポート。
XML 要素を直接処理する機能 (W3C DOM で必要な、コンテナ XML ドキュメントの作成は不要)。
強力で XPath または XQuery よりも使いやすいインメモリ XML ドキュメント変更。
強力なフィルタ処理、並べ替え、およびグループ化機能。
さまざまな種類のデータ ソースおよび形式のデータを操作できる一貫したモデル。
LINQ をサポートする C# 言語拡張
LINQ をサポートするために C# 3.0 に追加された新しい言語構造を次に示します。
言語構造 |
説明 |
---|---|
クエリ式 |
LINQ 対応のデータ ソースからデータを照会するために使用される宣言クエリ構文。詳細については、「LINQ クエリ式 (C# プログラミング ガイド)」および「LINQ をサポートする C# 3.0 の機能」を参照してください。 |
暗黙的に型指定される変数 |
修飾子 var で指定される変数。これにより、コンパイラは変数の型を推論できます。詳細については、「暗黙的に型指定されるローカル変数 (C# プログラミング ガイド)」および「LINQ をサポートする C# 3.0 の機能」を参照してください。 |
オブジェクト初期化子 |
オブジェクトのコンストラクタを明示的に呼び出さずにオブジェクトを初期化できます。詳細については、「オブジェクト初期化子とコレクション初期化子 (C# プログラミング ガイド)」および「LINQ をサポートする C# 3.0 の機能」を参照してください。 |
匿名型 |
コンパイラは、ユーザーが名前付きのデータ型を指定しなくてもオブジェクトを作成できます。型名を使用できるのはコンパイラのみです。詳細については、「匿名型 (C# プログラミング ガイド)」および「LINQ をサポートする C# 3.0 の機能」を参照してください。 |
拡張メソッド |
静的メソッドを型に関連付けることで、既存の型を拡張できます。詳細については、「LINQ をサポートする C# 3.0 の機能」を参照してください。 |
ラムダ式 |
デリゲート型が必要な場所で使用できるインライン式またはステートメント ブロック。 詳細については、「ラムダ式 (C# プログラミング ガイド)」および「LINQ をサポートする C# 3.0 の機能」を参照してください。 |
LINQ クエリの作成
ADO.NET データセット、SQL データベース、.NET コレクション、または XML ドキュメントのどれを使用している場合でも、LINQ クエリ式の基本構造は同じです。クエリ式は from 句で始まり、その後に where、orderby、select などのクエリ句が続きます。完成した式はクエリ変数に格納され、何回でも実行または変更できます。クエリ式の構文は、SQL の構文に似ています。たとえば、次の構文を使用して、students データベース内で専攻が science のすべての学生を返す LINQ クエリを作成できます。
IEnumerable<Student> studentQuery =
from student in studentApp.students
where student.Major == "Science"
select student;
クエリ式の詳細については、「クエリの基本操作 (LINQ)」、「LINQ クエリの概要」、および「チュートリアル : C# (LINQ) でのクエリの作成」を参照してください。
LINQ to Objects
LINQ to Objects という語句は、System.Collections 名前空間や System.Collections.Generic 名前空間内のクラスなど、メモリ内データ コレクションを照会するために LINQ を使用することを指します。これらのクラスには、ArrayList、List<T>、Dictionary<K,T> などがあります。配列は暗黙的に IEnumerable<T> をサポートしているため、配列を照会できます。詳細については、「LINQ to Objects」を参照してください。
テキスト ファイルを列挙可能なデータ構造にインポートし、その内容をフィルタ処理または並べ替えるクエリを実行することもできます。カスタマイズ例については、「方法 : 文字列での単語の出現回数をカウントする (LINQ)」を参照してください。
LINQ to SQL
O/R デザイナを使用して作成した、厳密に型指定されたオブジェクトのレイヤを通じて SQL Server データベースおよび SQL Server Express データベースにアクセスするには、LINQ to SQL を使用します。
O/R デザイナを使用すると、LINQ to SQL クラスをデータベース内のテーブルに割り当て、アプリケーション内のコントロールにデータをバインドする LINQ クエリを作成できます。たとえば、次の LINQ クエリは、LINQ クエリの結果 (米国出身の全顧客) を DataGridView コントロールのバインディング ソースにバインドします。
var CustomersQuery = from customers in northwindSampleDataContext1.Customers
where customers.Country == "US"
select customers;
customerBindingSource.DataSource = CustomersQuery;
詳細については、「LINQ to SQL」、「O/R デザイナの概要」、「チュートリアル : LINQ to SQL クラスの作成 (O/R デザイナ)」、および「方法 : プロジェクトに LINQ to SQL クラスを追加する (O/R デザイナ)」を参照してください。
メモ : |
---|
現在、O/R デザイナは SQL Server Compact 3.5 データベースをサポートしていません。SQL Server Express Edition の入手方法については、「方法 : サンプル データベースをインストールする」の「SQL Server Express Edition の入手」を参照してください。 |
LINQ to DataSet
アプリケーション内のコントロールにデータをバインドするには、DataSet を使用します。DataSet はデータベースに直接接続するのではなく、アプリケーションがオフライン (キャッシュ済み) データまたは複数のデータ ソースのサブセットを使用できるようにします。アプリケーションがオンラインになると、DataSet での変更をデータベースで更新できます。
LINQ to Dataset を使用すると、DataSet で使用できるフィルタ処理メソッドおよび並べ替えメソッドよりもすばやく簡単に、キャッシュされたデータを照会できます。詳細については、「LINQ to DataSet」を参照してください。
LINQ to XML
LINQ to XML では、XPath または XQuery ではなく LINQ クエリ式を使用することで、XML ドキュメントを簡単に作成および変更できます。LINQ to XML は、W3C のドキュメント オブジェクト モデル (DOM: Document Object Model) ではなく最新のプログラミング構成要素を使用する、新しいインメモリ XML プログラミング API です。詳細については、「LINQ to XML と DOM」、「LINQ to XML」、および「LINQ to XML クラスの概要」を参照してください。