LINQ to DataSet でのクエリQueries in LINQ to DataSet

クエリは、データ ソースからデータを取得する式です。A query is an expression that retrieves data from a data source. 一般に、クエリは専用のクエリ言語で表現されます。たとえば、リレーショナル データベースであれば SQL、XML であれば XQuery が使用されます。Queries are usually expressed in a specialized query language, such as SQL for relational databases and XQuery for XML. そのため、開発者はクエリの対象となるデータ ソースやデータ形式ごとに新しいクエリ言語を習得する必要があります。Therefore, developers have had to learn a new query language for each type of data source or data format that they query. 統合言語クエリ (LINQ: Language-Integrated Query)Language-Integrated Query (LINQ) データ ソースや形式のさまざまな種類のデータを操作するための単純化し、一貫性のあるモデルを提供します。offers a simpler, consistent model for working with data across various kinds of data sources and formats. LINQLINQ クエリでは、常にプログラミング オブジェクトを操作することになります。In a LINQLINQ query, you always work with programming objects.

LINQLINQ のクエリ操作は、データ ソースを取得し、クエリを作成して、クエリを実行するという 3 つのアクションから成ります。A LINQLINQ query operation consists of three actions: obtain the data source or sources, create the query, and execute the query.

を介したクエリは、[!INCLUDE[vbteclinq](../../../../includes/vbteclinq-md.md)] ジェネリック インターフェイスを実装するデータ ソースに対して行うことができます。Data sources that implement the generic interface can be queried through [!INCLUDE[vbteclinq](../../../../includes/vbteclinq-md.md)]. 呼び出す上、ジェネリックを実装するオブジェクトを返しますのデータ ソースとして機能するインターフェイスを[!INCLUDE[linq_dataset](../../../../includes/linq-dataset-md.md)]クエリ。Calling on a returns an object which implements the generic interface, which serves as the data source for [!INCLUDE[linq_dataset](../../../../includes/linq-dataset-md.md)] queries. クエリでは、データ ソースから取得する情報を正確に指定できます。In the query, you specify exactly the information that you want to retrieve from the data source. また、並べ替え、グループ化、整形方法を指定して情報を取得することもできます。A query can also specify how that information should be sorted, grouped, and shaped before it is returned. [!INCLUDE[vbteclinq](../../../../includes/vbteclinq-md.md)] では、クエリが変数に格納されます。In [!INCLUDE[vbteclinq](../../../../includes/vbteclinq-md.md)], a query is stored in a variable. 一連の値を返すようにクエリを設計する場合、クエリ変数そのものが列挙可能な型であることが必要です。If the query is designed to return a sequence of values, the query variable itself must be a enumerable type. このクエリ変数は、クエリの情報を保存するだけで、なんらかのアクションを実行したり、データを返したりすることはありません。This query variable takes no action and returns no data; it only stores the query information. クエリを作成した後、データを取得するには、そのクエリを実行する必要があります。After you create a query you must execute that query to retrieve any data. 一連の値を返すクエリでは、クエリ変数そのものはクエリ結果を保持しません。クエリ変数には、クエリのコマンドが格納されるだけです。In a query that returns a sequence of values, the query variable itself never holds the query results and only stores the query commands. クエリ変数が `foreach` ループまたは `For Each` ループで反復処理されるまで、クエリは実行されません。Execution of the query is deferred until the query variable is iterated over in a `foreach` or `For Each` loop. これは呼び出されます*遅延実行*; は、クエリが実行が作成された、クエリは、しばらく時間が発生します。This is called *deferred execution*; that is, query execution occurs some time after the query is constructed. これは、任意のタイミングでクエリを実行できるということを意味します。This means that you can execute a query as often as you want to. これは、たとえば他のアプリケーションによって更新されるデータベースがある場合に便利です。This is useful when, for example, you have a database that is being updated by other applications. アプリケーションで、最新情報を取得するクエリを作成し、それを繰り返し実行することにより、更新のたびに最新の情報を取得できます。In your application, you can create a query to retrieve the latest information and repeatedly execute the query, returning the updated information every time. 遅延実行によって一連の値を返すクエリとは対照的に、シングルトン値を返すクエリは直ちに実行されます。In contrast to deferred queries, which return a sequence of values, queries that return a singleton value are executed immediately. シングルトン クエリの例としては、 があります。Some examples of singleton queries are , , , and . これらのシングルトン クエリは、結果を計算するためにはクエリ結果が必要であるため、直ちに実行されます。These execute immediately because the query results are required to calculate the singleton result. たとえば、クエリ結果の平均を求めるためには、クエリを実行して、平均関数に入力データを与える必要があります。For example, in order to find the average of the query results the query must be executed so that the averaging function has input data to work with. シングルトン値を生成しないクエリでも、 メソッドまたは メソッドを使用することによって、即時実行を強制できます。You can also use the or methods on a query to force immediate execution of a query that does not produce a singleton value. 即時実行を強制するこの手法は、クエリの結果をキャッシュする場合などに使用すると効果的です。These techniques to force immediate execution can be useful when you want to cache the results of a query. ## クエリQueries [!INCLUDE[linq_dataset](../../../../includes/linq-dataset-md.md)] 2 つの異なる構文を使ってクエリを作成できます。 クエリ式の構文とメソッド ベースのクエリ構文。queries can be formulated in two different syntaxes: query expression syntax and method-based query syntax. ### クエリ式の構文Query Expression Syntax クエリ式は宣言型のクエリ構文です。Query expressions are a declarative query syntax. 開発者は SQL に似た構文形式を C# または Visual Basic で用いてクエリを作成できます。This syntax enables a developer to write queries in C# or Visual Basic in a format similar to SQL. クエリ式の構文を使用することにより、フィルター、並べ替え、グループ化など、データ ソースに対するきわめて複雑な処理を最小限のコードで実行できます。By using query expression syntax, you can perform even complex filtering, ordering, and grouping operations on data sources with minimal code. 詳細については、次を参照してください。 [LINQ クエリ式](../../../csharp/linq/index.md#query-expression-overview)と[基本的なクエリ操作 (Visual Basic)](../../../visual-basic/programming-guide/concepts/linq/basic-query-operations.md)します。For more information, see [LINQ Query Expressions](../../../csharp/linq/index.md#query-expression-overview) and [Basic Query Operations (Visual Basic)](../../../visual-basic/programming-guide/concepts/linq/basic-query-operations.md). クエリ式の構文は、C# 3.0 および [!INCLUDE[vb_orcas_long](../../../../includes/vb-orcas-long-md.md)] で新たに導入されたものです。Query expression syntax is new in C# 3.0 and [!INCLUDE[vb_orcas_long](../../../../includes/vb-orcas-long-md.md)]. ただし、[!INCLUDE[dnprdnshort](../../../../includes/dnprdnshort-md.md)] の共通言語ランタイム (CLR) は、クエリ式の構文そのものを理解することはできません。However, the [!INCLUDE[dnprdnshort](../../../../includes/dnprdnshort-md.md)] common language runtime (CLR) cannot read the query expression syntax itself. そのため、クエリ式はコンパイル時に、CLR が理解できる形式 (メソッド呼び出し) へと変換されます。Therefore, at compile time, query expressions are translated to something that the CLR does understand: method calls. これらのメソッドとして参照されます、*標準クエリ演算子*します。These methods are referred to as the *standard query operators*. 開発者は、クエリ構文を使う代わりに、メソッド構文を使ってそれらを直接呼び出すこともできます。As a developer, you have the option of calling them directly by using method syntax, instead of using query syntax. 詳細については、「[LINQ でのクエリ構文とメソッド構文](~/docs/csharp/programming-guide/concepts/linq/query-syntax-and-method-syntax-in-linq.md)」を参照してください。For more information, see [Query Syntax and Method Syntax in LINQ](~/docs/csharp/programming-guide/concepts/linq/query-syntax-and-method-syntax-in-linq.md). 標準クエリ演算子の詳細については、次を参照してください。[標準クエリ演算子の概要](../../../csharp/programming-guide/concepts/linq/standard-query-operators-overview.md)します。For more information about the standard query operators, see [Standard Query Operators Overview](../../../csharp/programming-guide/concepts/linq/standard-query-operators-overview.md). 次の例では、 を使用して `Product` テーブルからすべての行を取得し、製品名を表示しています。The following example uses to return all the rows from `Product` table and display the product names. [!code-csharp[DP LINQ to DataSet Examples#SelectSimple1](../../../../samples/snippets/csharp/VS_Snippets_ADO.NET/DP LINQ to DataSet Examples/CS/Program.cs#selectsimple1)] [!code-vb[DP LINQ to DataSet Examples#SelectSimple1](../../../../samples/snippets/visualbasic/VS_Snippets_ADO.NET/DP LINQ to DataSet Examples/VB/Module1.vb#selectsimple1)] ### メソッド ベースのクエリ構文Method-Based Query Syntax [!INCLUDE[linq_dataset](../../../../includes/linq-dataset-md.md)] クエリを作成するもう 1 つの方法として、メソッド ベースのクエリがあります。The other way to formulate [!INCLUDE[linq_dataset](../../../../includes/linq-dataset-md.md)] queries is by using method-based queries. メソッド ベースのクエリ構文は、[!INCLUDE[vbteclinq](../../../../includes/vbteclinq-md.md)] の演算子メソッドを、ラムダ式をパラメーターとして直接順次呼び出すものです。The method-based query syntax is a sequence of direct method calls to [!INCLUDE[vbteclinq](../../../../includes/vbteclinq-md.md)] operator methods, passing lambda expressions as the parameters. 詳細については、「[ラムダ式](~/docs/csharp/programming-guide/statements-expressions-operators/lambda-expressions.md)」を参照してください。For more information, see [Lambda Expressions](~/docs/csharp/programming-guide/statements-expressions-operators/lambda-expressions.md). 次の例では、 を使用して `Product` テーブルからすべての行を取得し、製品名を表示しています。This example uses to return all the rows from `Product` and display the product names. [!code-csharp[DP LINQ to DataSet Examples#SelectAnonymousTypes_MQ](../../../../samples/snippets/csharp/VS_Snippets_ADO.NET/DP LINQ to DataSet Examples/CS/Program.cs#selectanonymoustypes_mq)] [!code-vb[DP LINQ to DataSet Examples#SelectAnonymousTypes_MQ](../../../../samples/snippets/visualbasic/VS_Snippets_ADO.NET/DP LINQ to DataSet Examples/VB/Module1.vb#selectanonymoustypes_mq)] ## クエリの作成Composing Queries 前述したように、一連の値を返すように設計されたクエリでは、クエリ変数自体にはクエリ コマンドのみが格納されます。As mentioned earlier in this topic, the query variable itself only stores the query commands when the query is designed to return a sequence of values. クエリに即時実行を促すメソッドが含まれていなければ、`foreach` ループまたは `For Each` ループでクエリ変数を反復処理するまで、実際にはクエリは実行されません。If the query does not contain a method that will cause immediate execution, the actual execution of the query is deferred until you iterate over the query variable in a `foreach` or `For Each` loop. 遅延実行により、複数のクエリを組み合わせたり、クエリを拡張したりすることが可能となります。Deferred execution enables multiple queries to be combined or a query to be extended. クエリを拡張して新しい操作を追加すると、その変更が最終的な実行時に反映されます。When a query is extended, it is modified to include the new operations, and the eventual execution will reflect the changes. 次の例の最初のクエリでは、すべての製品が返されます。In the following example, the first query returns all the products. 2 つ目のクエリでは、サイズが "L" のすべての製品を返すように、`Where` を使って 1 つ目のクエリを拡張しています。The second query extends the first by using `Where` to return all the products of size "L": [!code-csharp[DP LINQ to DataSet Examples#Composing](../../../../samples/snippets/csharp/VS_Snippets_ADO.NET/DP LINQ to DataSet Examples/CS/Program.cs#composing)] [!code-vb[DP LINQ to DataSet Examples#Composing](../../../../samples/snippets/visualbasic/VS_Snippets_ADO.NET/DP LINQ to DataSet Examples/VB/Module1.vb#composing)] クエリを拡張した後は、追加のクエリを作成することはできません。それ以降のすべてのクエリでは、インメモリの [!INCLUDE[vbteclinq](../../../../includes/vbteclinq-md.md)] 演算子が使用されます。After a query has been executed, no additional queries can be composed, and all subsequent queries will use the in-memory [!INCLUDE[vbteclinq](../../../../includes/vbteclinq-md.md)] operators. クエリ変数を反復処理するときに、クエリの実行が発生、`foreach`または`For Each`ステートメント、またはのいずれかを呼び出して、[!INCLUDE[vbteclinq](../../../../includes/vbteclinq-md.md)]即時実行を発生させる変換演算子。Query execution will occur when you iterate over the query variable in a `foreach` or `For Each` statement, or by a call to one of the [!INCLUDE[vbteclinq](../../../../includes/vbteclinq-md.md)] conversion operators that cause immediate execution. 即時実行を促す演算子としては、 などがあります。These operators include the following: , , , and . 次の例の最初のクエリは、すべての製品を表示価格で並べ替えて返します。In the following example, the first query returns all the products ordered by list price. メソッドを使用して、クエリの即時実行を強制しています。The method is used to force immediate query execution: [!code-csharp[DP LINQ to DataSet Examples#ToArray2](../../../../samples/snippets/csharp/VS_Snippets_ADO.NET/DP LINQ to DataSet Examples/CS/Program.cs#toarray2)] [!code-vb[DP LINQ to DataSet Examples#ToArray2](../../../../samples/snippets/visualbasic/VS_Snippets_ADO.NET/DP LINQ to DataSet Examples/VB/Module1.vb#toarray2)] ## 関連項目See also