統合言語クエリ (LINQ)Language Integrated Query (LINQ)

統合言語クエリ (LINQ) は、C# 言語への直接的なクエリ機能の統合に基づくテクノロジのセットの名前です。Language-Integrated Query (LINQ) is the name for a set of technologies based on the integration of query capabilities directly into the C# language. これまでは、データに対するクエリは、コンパイル時の型チェックや IntelliSense のサポートがない単純な文字列として表現されてきました。Traditionally, queries against data are expressed as simple strings without type checking at compile time or IntelliSense support. さらに、SQL データベース、XML ドキュメント、さまざまな Web サービスといったデータ ソースの種類ごとに、異なるクエリ言語を習得する必要がありました。Furthermore, you have to learn a different query language for each type of data source: SQL databases, XML documents, various Web services, and so on. LINQ では、クエリは、クラス、メソッド、イベントと同様に、ファースト クラスの言語コンストラクトです。With LINQ, a query is a first-class language construct, just like classes, methods, events.

クエリを記述する開発者にとって、最も目立つ LINQ の "統合言語" 部分は、クエリ式です。For a developer who writes queries, the most visible "language-integrated" part of LINQ is the query expression. クエリ式は、宣言型の "クエリ構文" で記述されます。Query expressions are written in a declarative query syntax. クエリ構文を使用することで、フィルター処理、並べ替え、グループ化などのデータ ソースに対する操作を、最小限のコードで実行できます。By using query syntax, you can perform filtering, ordering, and grouping operations on data sources with a minimum of code. 同一の基本的なクエリ式のパターンを使用して、SQL データベース、ADO .NET データセット、XML ドキュメントとストリーム、および .NET コレクション内のデータを照会して変換できます。You use the same basic query expression patterns to query and transform data in SQL databases, ADO .NET Datasets, XML documents and streams, and .NET collections.

次の例は、完全なクエリ操作を示しています。The following example shows the complete query operation. 完全な操作には、データ ソースの作成、クエリ式の定義、および foreach ステートメントでのクエリの実行が含まれています。The complete operation includes creating a data source, defining the query expression, and executing the query in a foreach statement.

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

クエリ式の概要Query expression overview

  • クエリ式を使用して、任意の LINQ 対応データ ソースのデータを照会して変換することができます。Query expressions can be used to query and to transform data from any LINQ-enabled data source. たとえば、1 つのクエリで SQL データベースからデータを取得し、出力として XML ストリームを生成できます。For example, a single query can retrieve data from a SQL database, and produce an XML stream as output.

  • クエリ式は、多くの使い慣れた C# 言語の構成体を使用するため、簡単に習得できます。Query expressions are easy to master because they use many familiar C# language constructs.

  • クエリ式内の変数はすべて厳密に型指定されますが、多くの場合、型はコンパイラが推測できるため、明示的に指定する必要はありません。The variables in a query expression are all strongly typed, although in many cases you do not have to provide the type explicitly because the compiler can infer it. 詳細については、「LINQ クエリ操作での型の関係」を参照してください。For more information, see Type relationships in LINQ query operations.

  • クエリは、たとえば foreach ステートメントでクエリ変数を反復処理するまで実行されません。A query is not executed until you iterate over the query variable, for example, in a foreach statement. 詳細については、「LINQ クエリの概要」を参照してください。For more information, see Introduction to LINQ queries.

  • コンパイル時に、クエリ式は、C# 仕様に規定された規則に従って、標準クエリ演算子メソッドの呼び出しに変換されます。At compile time, query expressions are converted to Standard Query Operator method calls according to the rules set forth in the C# specification. クエリ構文を使用して表現できるすべてのクエリは、メソッド構文でも表現することができます。Any query that can be expressed by using query syntax can also be expressed by using method syntax. ただし、ほとんどの場合、クエリ構文のほうが読みやすく、簡潔です。However, in most cases query syntax is more readable and concise. 詳細については、「# 言語仕様」と「標準クエリ演算子の概要」を参照してください。For more information, see C# language specification and Standard query operators overview.

  • 原則として、LINQ クエリを記述するときは、可能であれば常にクエリ構文を使用し、必要な場合にメソッド構文を使用することをお勧めします。As a rule when you write LINQ queries, we recommend that you use query syntax whenever possible and method syntax whenever necessary. この 2 つの異なる形式の間には、セマンティックの違いもパフォーマンスの違いもありません。There is no semantic or performance difference between the two different forms. 多くの場合、クエリ式のほうが、メソッド構文で記述された同等の式よりも読みやすくなります。Query expressions are often more readable than equivalent expressions written in method syntax.

  • CountMax など一部のクエリ操作には、同等のクエリ式の句がないため、メソッドの呼び出しとして表す必要があります。Some query operations, such as Count or Max, have no equivalent query expression clause and must therefore be expressed as a method call. メソッド構文は、さまざまな方法でクエリ構文と組み合わせることができます。Method syntax can be combined with query syntax in various ways. 詳細については、「LINQ でのクエリ構文とメソッド構文」を参照してください。For more information, see Query syntax and method syntax in LINQ.

  • クエリ式は、クエリの適用対象の種類によって、式ツリーまたはデリゲートにコンパイルすることができます。Query expressions can be compiled to expression trees or to delegates, depending on the type that the query is applied to. IEnumerable<T> クエリはデリゲートにコンパイルされます。IEnumerable<T> queries are compiled to delegates. IQueryable および IQueryable<T> クエリは式ツリーにコンパイルされます。IQueryable and IQueryable<T> queries are compiled to expression trees. 詳細については、「式ツリー」を参照してください。For more information, see Expression trees.

次のステップNext steps

LINQ の詳細については、最初に「クエリ式の基本」で基本的な概念を理解してから、関心のある LINQ テクノロジのドキュメントを参照してください。To learn more details about LINQ, start by becoming familiar with some basic concepts in Query expression basics, and then read the documentation for the LINQ technology in which you are interested:

LINQ 全般をより深く理解するには、「C# での LINQ」を参照してください。To gain a deeper understanding of LINQ in general, see LINQ in C#.

C# での LINQ の使用を開始するには、「LINQ の使用」チュートリアルを参照してください。To start working with LINQ in C#, see the tutorial Working with LINQ.