標準クエリ演算子の概要 (C#)
"標準クエリ演算子" は、LINQ パターンを形成するメソッドです。 これらのメソッドの大部分はシーケンスに対して機能します。ここでシーケンスとは、IEnumerable<T> インターフェイスまたは IQueryable<T> インターフェイスを実装している型のオブジェクトのことです。 標準クエリ演算子には、フィルター処理、プロジェクション、集計、並べ替えなどのクエリ機能が用意されています。
LINQ 標準クエリ演算子には 2 つのセットがあります。1 つは IEnumerable<T> 型のオブジェクトを操作する演算子、もう 1 つは IQueryable<T> 型のオブジェクトを操作する演算子です。 各セットを構成するメソッドは、それぞれ、Enumerable および Queryable クラスの静的メンバーです。 そのメソッドの操作対象である型の "拡張メソッド" として定義されています。 拡張メソッドは、静的メソッド構文またはインスタンス メソッド構文のいずれかを使用して呼び出すことができます。
さらに、いくつかの標準クエリ演算子メソッドが、IEnumerable<T> または IQueryable<T> を基にする型以外の型を操作します。 Enumerable 型は、このような 2 つのメソッドを定義し、その両方が IEnumerable 型のオブジェクトを操作します。 これらのメソッド Cast<TResult>(IEnumerable) と OfType<TResult>(IEnumerable) を使用して、LINQ パターンでクエリされるパラメーター化されていないまたは非ジェネリック型のコレクションを有効にすることができます。 これを行うには、厳密に型指定されたオブジェクトのコレクションを作成します。 Queryable クラスは、型 IQueryable のオブジェクトを操作する 2 つの類似したメソッド Cast<TResult>(IQueryable) と OfType<TResult>(IQueryable) を定義します。
標準クエリ演算子の実行のタイミングは、シングルトン値を返すか、値のシーケンスを返すかで異なります。 これらのシングルトン値を返すメソッド (たとえば、Average と Sum) は、すぐに実行されます。 シーケンスを返すメソッドは、クエリの実行を遅延させ、列挙可能なオブジェクトを返します。
メモリ内コレクションを操作するメソッド、つまり IEnumerable<T> を拡張するメソッドの場合、返される列挙可能なオブジェクトは、メソッドに渡された引数をキャプチャします。 オブジェクトが列挙されると、クエリ演算子のロジックが使用され、クエリ結果が返されます。
対照的に、IQueryable<T> を拡張するメソッドではいかなるクエリ動作も実装されません。 実行するクエリを表す式ツリーがビルドされます。 クエリの処理は、ソース IQueryable<T> オブジェクトによって処理されます。
クエリ メソッドの呼び出しは 1 回のクエリにまとめてチェーン化できるため、クエリが複雑になることがあります。
次のコード例は、標準クエリ演算子を使用してシーケンスに関する情報を取得する方法を示しています。
string sentence = "the quick brown fox jumps over the lazy dog";
// Split the string into individual words to create a collection.
string[] words = sentence.Split(' ');
// Using query expression syntax.
var query = from word in words
group word.ToUpper() by word.Length into gr
orderby gr.Key
select new { Length = gr.Key, Words = gr };
// Using method-based query syntax.
var query2 = words.
GroupBy(w => w.Length, w => w.ToUpper()).
Select(g => new { Length = g.Key, Words = g }).
OrderBy(o => o.Length);
foreach (var obj in query)
{
Console.WriteLine("Words of length {0}:", obj.Length);
foreach (string word in obj.Words)
Console.WriteLine(word);
}
// This code example produces the following output:
//
// Words of length 3:
// THE
// FOX
// THE
// DOG
// Words of length 4:
// OVER
// LAZY
// Words of length 5:
// QUICK
// BROWN
// JUMPS
クエリ式の構文
頻繁に使用される標準クエリ演算子の中には、C# および Visual Basic 言語専用のキーワード構文が使用されているものがあります。こうした構文では、標準クエリ演算子を、"クエリ式" の一部として呼び出すことができます。 専用キーワードおよびそれに対応する構文が使用されている標準クエリ演算子の詳細については、「標準クエリ演算子のクエリ式構文 (C#)」を参照してください。
標準クエリ演算子の拡張
標準クエリ演算子のセットを拡張するには、対象のドメインまたはテクノロジに適したドメイン固有のメソッドを作成します。 また、標準クエリ演算子を、リモート評価、クエリ変換、最適化などの追加サービスが用意されている独自の実装で置き換えることもできます。 例については、「AsEnumerable」を参照してください。
関連項目
次のリンクをクリックすると、さまざまな標準クエリ演算子に関する追加情報を機能別に提供する記事に移動します。