LINQ クエリ式 (C# プログラミング ガイド)
統合言語クエリ (LINQ) は、クエリ機能を C# 言語 (および Visual Basic や場合によってその他の .NET 言語) に直接統合する一連の技術の名前です。LINQ を使用すると、クエリは、クラス、メソッド、イベントなどと同じように、高度な機能を備えた言語構成要素になります。
クエリを記述する開発者の場合、LINQ で最も違いを認識できる "統合言語" 部分はクエリ式です。クエリ式は、C# 3.0 で導入された宣言クエリ構文で記述します。クエリ構文を使用すると、データ ソースに対する複雑なフィルター処理、順序付け、およびグループ化の操作を最小限のコードで実行できます。同じ基本的なクエリ式のパターンを使用して、SQL データベース、ADO.NET データセット、XML ドキュメントとストリーム、および .NET コレクション内のデータを照会および変換します。
完全なクエリ操作の例を次に示します。完全な操作には、データ ソースの作成、クエリ式の定義、および foreach ステートメントでのクエリの実行が含まれます。
class LINQQueryExpressions
{
static void Main()
{
// Specify the data source.
int[] scores = new int[] { 97, 92, 81, 60 };
// Define the query expression.
IEnumerable<int> scoreQuery =
from score in scores
where score > 80
select score;
// Execute the query.
foreach (int i in scoreQuery)
{
Console.Write(i + " ");
}
}
}
// Output: 97 92 81
C# の LINQ の基本的な事項の詳細については、「C# の LINQ の概要」を参照してください。
クエリ式の概要
クエリ式を使用すると、LINQ 対応のデータ ソースのデータを照会および変換できます。たとえば、1 つのクエリで、SQL データベースからデータを取得し、XML ストリームを出力として生成できます。
クエリ式は多くの使い慣れた C# 言語構成要素を使用するため、簡単に習得できます。詳細については、「C# の LINQ の概要」を参照してください。
クエリ式の変数はすべて厳密に型指定されていますが、多くの場合、コンパイラが型を推論できるので、明示的に型を指定する必要はありません。詳細については、「LINQ クエリ操作での型の関係 (C#)」を参照してください。
クエリは、foreach ステートメントでクエリ変数の反復処理が完了するまで実行されません。詳細については、「LINQ クエリの概要 (C#)」を参照してください。
コンパイル時に、C# 仕様に規定された規則に従って、クエリ式が標準クエリ演算子メソッド呼び出しに変換されます。クエリ構文を使用して表現できるクエリはすべて、メソッド構文を使用して表現することもできます。ただし、多くの場合、クエリ構文はよりわかりやすく簡潔です。詳細については、「C# 言語仕様」および「標準クエリ演算子の概要」を参照してください。
一般に、LINQ クエリを記述する場合、可能なときは常にクエリ構文を使用し、必要に応じてメソッド構文を使用することをお勧めします。この 2 つの形式の間に意味および動作についての違いはありません。クエリ式は多くの場合、メソッド構文で記述された同等の式に比べてわかりやすくなります。
Count や Max などの一部のクエリ操作には同等のクエリ式の句がないため、メソッド呼び出しとして表現する必要があります。メソッド構文は、さまざまな方法でクエリ構文と組み合わせることができます。詳細については、「LINQ でのクエリ構文とメソッド構文 (C#)」を参照してください。
クエリ式をコンパイルすると、クエリを適用する対象の型に応じて式ツリーまたはデリゲートを作成できます。IEnumerable<T> クエリをコンパイルすると、デリゲートが作成されます。IQueryable クエリおよび IQueryable<T> クエリをコンパイルすると式ツリーが作成されます。詳細については、「式ツリー (C# および Visual Basic)」を参照してください。
クエリの追加情報および一般的なタスクのコード例に関するトピックを次の表に示します。
トピック |
Description |
---|---|
基本的なクエリの概念を紹介し、C# クエリ構文の例について説明します。 |
|
クエリ式のいくつかの基本的な種類の例について説明します。 |
|
例外をスローする可能性のあるコードを、いつどのようにしてクエリ式の外に移動するかを説明します。 |
|
select ステートメントを使用して、異なるソースのデータを新しい型にマージする方法を示します。 |
|
group 句のさまざまな使用方法を示します。 |
|
ネストされたグループの作成方法を示します。 |
|
クエリの部分式を新しいクエリのデータ ソースとして使用する方法を示します。 |
|
ストリーミング データ ソースの操作をグループ化できるスレッド セーフの標準クエリ演算子を実装する方法を示します。 |
|
任意の数の値を渡し、where 句で等価比較に使用する方法を示します。 |
|
foreach ループを使用しないで、クエリの結果を具体化および格納する方法を示します。 |
|
メソッドからクエリ変数を返す方法、およびそれらを入力パラメーターとしてメソッドに渡す方法を示します。 |
|
任意の種類の述語関数に基づいて結合演算を実行する方法を示します。 |
|
複数の一致キーに基づいて 2 つのソースを結合する方法を示します。 |
|
結合演算で生成されたシーケンスの順序を指定する方法を示します。 |
|
LINQ で内部結合を実行する方法を示します。 |
|
LINQ でグループ化結合を生成する方法を示します。 |
|
LINQ で左外部結合を生成する方法を示します。 |
|
LINQ クエリで null 値を処理する方法を示します。 |
参照
処理手順
概念
その他の技術情報
統合言語クエリ (LINQ: Language-Integrated Query)
How Linq to Objects Queries Work (Linq to Objects クエリの機能)
Reading and Writing Queries (クエリの読み込みと作成)
What is a collection? (コレクションとは)
Link to Everything: A List of LINQ Providers (Link to Everything: LINQ プロバイダーの一覧)