標準クエリ演算子の概要 (C#)Standard Query Operators Overview (C#)

"標準クエリ演算子" は、LINQ パターンを形成するメソッドです。The standard query operators are the methods that form the LINQ pattern. これらのメソッドの大部分はシーケンスに対して機能します。ここでシーケンスとは、IEnumerable<T> インターフェイスまたは IQueryable<T> インターフェイスを実装している型のオブジェクトのことです。Most of these methods operate on sequences, where a sequence is an object whose type implements the IEnumerable<T> interface or the IQueryable<T> interface. 標準クエリ演算子には、フィルター処理、プロジェクション、集計、並べ替えなどのクエリ機能が用意されています。The standard query operators provide query capabilities including filtering, projection, aggregation, sorting and more.

LINQ 標準クエリ演算子には 2 つのセットがあります。1 つは IEnumerable<T> 型のオブジェクトを操作する演算子、もう 1 つは IQueryable<T> 型のオブジェクトを操作する演算子です。There are two sets of LINQ standard query operators, one that operates on objects of type IEnumerable<T> and the other that operates on objects of type IQueryable<T>. 各セットを構成するメソッドは、それぞれ、Enumerable および Queryable クラスの静的メンバーです。The methods that make up each set are static members of the Enumerable and Queryable classes, respectively. そのメソッドの操作対象である型の "拡張メソッド" として定義されています。They are defined as extension methods of the type that they operate on. つまり、静的メソッド構文またはインスタンス メソッド構文のいずれかを使用して呼び出すことができます。This means that they can be called by using either static method syntax or instance method syntax.

さらに、いくつかの標準クエリ演算子メソッドが、IEnumerable<T> または IQueryable<T> を基にする型以外の型を操作します。In addition, several standard query operator methods operate on types other than those based on IEnumerable<T> or IQueryable<T>. Enumerable 型は、このような 2 つのメソッドを定義し、その両方が IEnumerable 型のオブジェクトを操作します。The Enumerable type defines two such methods that both operate on objects of type IEnumerable. これらのメソッド Cast<TResult>(IEnumerable)OfType<TResult>(IEnumerable) を使用して、LINQ パターンでクエリされるパラメーター化されていないまたは非ジェネリック型のコレクションを有効にすることができます。These methods, Cast<TResult>(IEnumerable) and OfType<TResult>(IEnumerable), let you enable a non-parameterized, or non-generic, collection to be queried in the LINQ pattern. これを行うには、厳密に型指定されたオブジェクトのコレクションを作成します。They do this by creating a strongly-typed collection of objects. Queryable クラスは、型 Queryable のオブジェクトを操作する 2 つの類似したメソッド Cast<TResult>(IQueryable)OfType<TResult>(IQueryable) を定義します。The Queryable class defines two similar methods, Cast<TResult>(IQueryable) and OfType<TResult>(IQueryable), that operate on objects of type Queryable.

標準クエリ演算子の実行のタイミングは、シングルトン値を返すか、値のシーケンスを返すかで異なります。The standard query operators differ in the timing of their execution, depending on whether they return a singleton value or a sequence of values. これらのシングルトン値を返すメソッド (たとえば、AverageSum) は、すぐに実行されます。Those methods that return a singleton value (for example, Average and Sum) execute immediately. シーケンスを返すメソッドは、クエリの実行を遅延させ、列挙可能なオブジェクトを返します。Methods that return a sequence defer the query execution and return an enumerable object.

メモリ内コレクションを操作するメソッド、つまり IEnumerable<T> を拡張するメソッドの場合、返される列挙可能なオブジェクトは、メソッドに渡された引数をキャプチャします。In the case of the methods that operate on in-memory collections, that is, those methods that extend IEnumerable<T>, the returned enumerable object captures the arguments that were passed to the method. オブジェクトが列挙されると、クエリ演算子のロジックが使用され、クエリ結果が返されます。When that object is enumerated, the logic of the query operator is employed and the query results are returned.

一方、IQueryable<T> を拡張するメソッドはクエリ動作を実装しませんが、実行されるクエリを表す式ツリーを作成します。In contrast, methods that extend IQueryable<T> do not implement any querying behavior, but build an expression tree that represents the query to be performed. クエリの処理は、ソース IQueryable<T> オブジェクトによって処理されます。The query processing is handled by the source IQueryable<T> object.

クエリ メソッドの呼び出しは 1 回のクエリにまとめてチェーン化できるため、クエリが複雑になることがあります。Calls to query methods can be chained together in one query, which enables queries to become arbitrarily complex.

次のコード例は、標準クエリ演算子を使用してシーケンスに関する情報を取得する方法を示しています。The following code example demonstrates how the standard query operators can be used to obtain information about a sequence.

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   

クエリ式の構文Query Expression Syntax

頻繁に使用される標準クエリ演算子の中には、C# および Visual Basic 言語専用のキーワード構文が使用されているものがあります。こうした構文では、標準クエリ演算子を、"クエリ " の一部として呼び出すことができます。Some of the more frequently used standard query operators have dedicated C# and Visual Basic language keyword syntax that enables them to be called as part of a query expression. 専用キーワードおよびそれに対応する構文が使用されている標準クエリ演算子の詳細については、「標準クエリ演算子のクエリ式構文 (C#)」を参照してください。For more information about standard query operators that have dedicated keywords and their corresponding syntaxes, see Query Expression Syntax for Standard Query Operators (C#).

標準クエリ演算子の拡張Extending the Standard Query Operators

標準クエリ演算子のセットを拡張するには、対象のドメインまたはテクノロジに適したドメイン固有のメソッドを作成します。You can augment the set of standard query operators by creating domain-specific methods that are appropriate for your target domain or technology. また、標準クエリ演算子を、リモート評価、クエリ変換、最適化などの追加サービスが用意されている独自の実装で置き換えることもできます。You can also replace the standard query operators with your own implementations that provide additional services such as remote evaluation, query translation, and optimization. 例については、「AsEnumerable」を参照してください。See AsEnumerable for an example.

次のリンクをクリックすると、さまざまな標準クエリ演算子に関する追加情報を機能別に確認することができます。The following links take you to topics that provide additional information about the various standard query operators based on functionality.

データの並べ替え (C#)Sorting Data (C#)

セット操作 (C#)Set Operations (C#)

データのフィルター処理 (C#)Filtering Data (C#)

量指定子操作 (C#)Quantifier Operations (C#)

射影操作 (C#)Projection Operations (C#)

データのパーティション分割Partitioning Data (C#)

結合演算 (C#)Join Operations (C#)

データのグループ化 (C#)Grouping Data (C#)

生成操作 (C#)Generation Operations (C#)

等価演算 (C#)Equality Operations (C#)

要素操作 (C#)Element Operations (C#)

データ型の変換 (C#)Converting Data Types (C#)

連結演算 (C#)Concatenation Operations (C#)

集計操作 (C#)Aggregation Operations (C#)

関連項目See also