Visual Basic における LINQ の概要Introduction to LINQ in Visual Basic

統合言語クエリ (LINQ) では、Visual Basic にクエリ機能を追加し、あらゆる種類のデータを操作するときに、シンプルで強力な機能を提供します。Language-Integrated Query (LINQ) adds query capabilities to Visual Basic and provides simple and powerful capabilities when you work with all kinds of data. LINQ では、クエリをデータベースに送信して処理したり、検索対象のデータの種類ごとに異なるクエリ構文を使用したりするのではなく、Visual Basic 言語の一部としてクエリを導入します。Rather than sending a query to a database to be processed, or working with different query syntax for each type of data that you are searching, LINQ introduces queries as part of the Visual Basic language. LINQ では、データの型に関係なく、統一された構文を使用します。It uses a unified syntax regardless of the type of data.

LINQ を使用すると、SQL Server データベース、XML、メモリ内の配列とコレクション、ADO.NET データセット、または LINQ をサポートするその他のリモートまたはローカルデータソースのデータに対してクエリを実行できます。LINQ enables you to query data from a SQL Server database, XML, in-memory arrays and collections, ADO.NET datasets, or any other remote or local data source that supports LINQ. これは、共通の Visual Basic 言語要素を使用して行うことができます。You can do all this with common Visual Basic language elements. クエリは Visual Basic 言語で記述されているため、クエリ結果は厳密に型指定されたオブジェクトとして返されます。Because your queries are written in the Visual Basic language, your query results are returned as strongly-typed objects. これらのオブジェクトは IntelliSense をサポートするので、コードの記述時間を短縮でき、さらに、クエリに含まれるエラーを実行時ではなくコンパイル時に把握できます。These objects support IntelliSense, which enables you to write code faster and catch errors in your queries at compile time instead of at run time. LINQ クエリは、結果を絞り込むための追加クエリのソースとして使用できます。LINQ queries can be used as the source of additional queries to refine results. クエリ結果をユーザーが簡単に表示および変更できるように、コントロールにバインディングすることもできます。They can also be bound to controls so that users can easily view and modify your query results.

たとえば、次のコード例は、コレクションから顧客リストを返し、住所に基づいて顧客をグループ化する LINQ クエリを示しています。For example, the following code example shows a LINQ query that returns a list of customers from a collection and groups them based on their location.

' Obtain a list of customers.
Dim customers As List(Of Customer) = GetCustomers()

' Return customers that are grouped based on country.
Dim countries = From cust In customers
                Order By cust.Country, cust.City
                Group By CountryName = cust.Country
                Into CustomersInCountry = Group, Count()
                Order By CountryName

' Output the results.
For Each country In countries
    Debug.WriteLine(country.CountryName & " count=" & country.Count)

    For Each customer In country.CustomersInCountry
        Debug.WriteLine("   " & customer.CompanyName & "  " & customer.City)
    Next
Next

' Output:
'   Canada count=2
'      Contoso, Ltd  Halifax
'      Fabrikam, Inc.  Vancouver
'   United States count=1
'      Margie's Travel  Redmond

例の実行Running the examples

概要とLINQ クエリセクションの構造で例を実行するには、顧客と注文の一覧を返す次のコードを追加します。To run the examples in the introduction and in the Structure of a LINQ Query section, include the following code, which returns lists of customers and orders.

' Return a list of customers.
Private Function GetCustomers() As List(Of Customer)
    Return New List(Of Customer) From
        {
            New Customer With {.CustomerID = 1, .CompanyName = "Contoso, Ltd", .City = "Halifax", .Country = "Canada"},
            New Customer With {.CustomerID = 2, .CompanyName = "Margie's Travel", .City = "Redmond", .Country = "United States"},
            New Customer With {.CustomerID = 3, .CompanyName = "Fabrikam, Inc.", .City = "Vancouver", .Country = "Canada"}
        }
End Function

' Return a list of orders.
Private Function GetOrders() As List(Of Order)
    Return New List(Of Order) From
        {
            New Order With {.CustomerID = 1, .Amount = "200.00"},
            New Order With {.CustomerID = 3, .Amount = "600.00"},
            New Order With {.CustomerID = 1, .Amount = "300.00"},
            New Order With {.CustomerID = 2, .Amount = "100.00"},
            New Order With {.CustomerID = 3, .Amount = "800.00"}
        }
End Function

' Customer Class.
Private Class Customer
    Public Property CustomerID As Integer
    Public Property CompanyName As String
    Public Property City As String
    Public Property Country As String
End Class

' Order Class.
Private Class Order
    Public Property CustomerID As Integer
    Public Property Amount As Decimal
End Class

LINQ プロバイダーLINQ providers

Linq プロバイダーは、クエリ対象のデータソースに Visual Basic linq クエリをマップします。A LINQ provider maps your Visual Basic LINQ queries to the data source being queried. LINQ クエリを記述すると、そのクエリは、プロバイダーによって、データ ソースが実行できるコマンドに変換されます。When you write a LINQ query, the provider takes that query and translates it into commands that the data source will be able to execute. プロバイダーは、ソースのデータを、クエリ結果を構成するオブジェクトに変換する操作も行います。The provider also converts data from the source to the objects that make up your query result. 最後に、プロバイダーは、データ ソースに更新が送信されるときに、オブジェクトをデータに変換します。Finally, it converts objects to data when you send updates to the data source.

Visual Basic には、次の LINQ プロバイダーが含まれています。Visual Basic includes the following LINQ providers.

プロバイダーProvider 説明Description
LINQ to ObjectsLINQ to Objects LINQ to Objects プロバイダーは、インメモリ コレクションとインメモリ配列のクエリを可能にします。The LINQ to Objects provider enables you to query in-memory collections and arrays. オブジェクトが IEnumerable インターフェイスまたは IEnumerable<T> インターフェイスをサポートしている場合、LINQ to Objects プロバイダーを使用してクエリを実行できます。If an object supports either the IEnumerable or IEnumerable<T> interface, the LINQ to Objects provider enables you to query it.

LINQ to Objects プロバイダーは、すべての Visual Basic プロジェクトにSystem.Linq既定でインポートされる名前空間をインポートすることによって有効にすることができます。You can enable the LINQ to Objects provider by importing the System.Linq namespace, which is imported by default for all Visual Basic projects.

LINQ to Objects プロバイダーの詳細については、「 LINQ to Objects」を参照してください。For more information about the LINQ to Objects provider, see LINQ to Objects.
LINQ to SQLLINQ to SQL LINQ to SQL プロバイダーは、SQL Server データベース内のデータのクエリと変更を可能にします。The LINQ to SQL provider enables you to query and modify data in a SQL Server database. これにより、アプリケーションのオブジェクト モデルを、データベース内のテーブルとオブジェクトに簡単に対応付けることができます。This makes it easy to map the object model for an application to the tables and objects in a database.

Visual Basic を使用すると、オブジェクトリレーショナルデザイナー (O/R デザイナー) を含めることにより、LINQ to SQL を簡単に操作できるようになります。Visual Basic makes it easier to work with LINQ to SQL by including the Object Relational Designer (O/R Designer). このデザイナーを使用して、データベース内のオブジェクトに対応付けられるアプリケーション内のオブジェクト モデルを作成します。This designer is used to create an object model in an application that maps to objects in a database. O/R デザイナーには、ストアドプロシージャと関数をDataContextオブジェクトにマップする機能も用意されています。このオブジェクトは、データベースとの通信を管理し、オプティミスティック同時実行制御チェックの状態を格納します。The O/R Designer also provides functionality to map stored procedures and functions to the DataContext object, which manages communication with the database and stores state for optimistic concurrency checks.

LINQ to SQL プロバイダーの詳細については、「 LINQ to SQL」を参照してください。For more information about the LINQ to SQL provider, see LINQ to SQL. オブジェクトリレーショナルデザイナーの詳細については、「 Visual Studio の LINQ to SQL ツール」を参照してください。For more information about the Object Relational Designer, see LINQ to SQL Tools in Visual Studio.
LINQ to XMLLINQ to XML LINQ to XML プロバイダーは、XML のクエリと変更を可能にします。The LINQ to XML provider enables you to query and modify XML. インメモリ XML を変更することや、XML をファイルから読み込んだりファイルに保存したりすることができます。You can modify in-memory XML, or you can load XML from and save XML to a file.

さらに、LINQ to XML プロバイダーを使用すると、xml リテラルと XML 軸プロパティを使用して、Visual Basic コードに XML を直接書き込むことができます。Additionally, the LINQ to XML provider enables XML literals and XML axis properties that enable you to write XML directly in your Visual Basic code. 詳細については、「 XML」を参照してください。For more information, see XML.
LINQ to DataSetLINQ to DataSet LINQ to DataSet プロバイダーを使用すると、ADO.NET データセット内のデータに対してクエリや更新を行うことができます。The LINQ to DataSet provider enables you to query and update data in an ADO.NET dataset. データセットを使用するアプリケーションに LINQ を追加することで、データセット内のデータのクエリ、集計、および更新などの機能を単純化すると同時に拡張できます。You can add the power of LINQ to applications that use datasets in order to simplify and extend your capabilities for querying, aggregating, and updating the data in your dataset.

詳細については、「LINQ to DataSet」を参照してください。For more information, see LINQ to DataSet.

LINQ クエリの構造Structure of a LINQ query

LINQ クエリ (クエリ式と呼ばれることもあります) は、クエリのデータソースと反復変数を識別するクエリ句の組み合わせで構成されます。A LINQ query, often referred to as a query expression, consists of a combination of query clauses that identify the data sources and iteration variables for the query. クエリ式には、並べ替え、フィルター処理、グループ化、および結合を実行する命令や、ソース データに適用する演算も指定できます。A query expression can also include instructions for sorting, filtering, grouping, and joining, or calculations to apply to the source data. クエリ式の構文は SQL の構文に似ているので、ほとんどの構文は、改めて覚える必要はありません。Query expression syntax resembles the syntax of SQL; therefore, you may find much of the syntax familiar.

クエリ式は、From 句で始まります。A query expression starts with a From clause. この句は、クエリのソース データと、ソース データの各要素を個別に参照するために使用される変数を識別します。This clause identifies the source data for a query and the variables that are used to refer to each element of the source data individually. これらの変数は、名前付き範囲変数または反復変数です。These variables are named range variables or iteration variables. From 句は、Aggregate クエリ以外のクエリでは必須です。このクエリでは、From 句は省略できます。The From clause is required for a query, except for Aggregate queries, where the From clause is optional. From 句または Aggregate 句でクエリのスコープとソースを識別した後、クエリを絞り込むためのクエリ句を自由に組み合わせて記述できます。After the scope and source of the query are identified in the From or Aggregate clauses, you can include any combination of query clauses to refine the query. クエリ句の詳細については、このトピックで後述する「LINQ クエリ演算子の Visual Basic」を参照してください。For details about query clauses, see Visual Basic LINQ Query Operators later in this topic. たとえば、次のクエリでは、顧客データのソース コレクションを customers 変数として識別し、cust という名前の反復変数を識別します。For example, the following query identifies a source collection of customer data as the customers variable, and an iteration variable named cust.

Dim customers = GetCustomers()

Dim queryResults = From cust In customers

For Each result In queryResults
    Debug.WriteLine(result.CompanyName & "  " & result.Country)
Next

' Output:
'   Contoso, Ltd  Canada
'   Margie's Travel  United States
'   Fabrikam, Inc.  Canada

この例はそのままでも有効なクエリですが、結果を絞り込むクエリ句を追加すると、はるかに強力なクエリになります。This example is a valid query by itself; however, the query becomes far more powerful when you add more query clauses to refine the result. たとえば、Where 句を追加して、結果を 1 つ以上の値でフィルター処理できます。For example, you can add a Where clause to filter the result by one or more values. クエリ式は、1 行のコードです。追加のクエリ句は、クエリの末尾に単純に追加できます。Query expressions are a single line of code; you can just append additional query clauses to the end of the query. アンダースコア (_) の行連結文字を使用すると、複数行のテキストにまたがるクエリを分割して、読みやすさを向上させることができます。You can break up a query across multiple lines of text to improve readability by using the underscore (_) line-continuation character. 次のコード例は、Where 句を含むクエリの例を示しています。The following code example shows an example of a query that includes a Where clause.

Dim queryResults = From cust In customers
                   Where cust.Country = "Canada"

別の強力なクエリ句として、Select 句があります。この句を使用すると、データ ソースから選択したフィールドだけを返すことができます。Another powerful query clause is the Select clause, which enables you to return only selected fields from the data source. LINQ クエリは、厳密に型指定されたオブジェクトの列挙可能なコレクションを返します。LINQ queries return enumerable collections of strongly typed objects. クエリは、匿名型または名前付きの型のコレクションを返すことができます。A query can return a collection of anonymous types or named types. Select 句を使用して、データ ソースから単一のフィールドを返すことができます。You can use the Select clause to return only a single field from the data source. これを行った場合、返されるコレクションの型は、その単一のフィールドの型になります。When you do this, the type of the collection returned is the type of that single field. Select 句を使用して、データ ソースから複数のフィールドを返すこともできます。You can also use the Select clause to return multiple fields from the data source. これを行った場合、返されるコレクションの型は、新しい匿名型になります。When you do this, the type of the collection returned is a new anonymous type. クエリで返されたフィールドを、指定した名前付きの型のフィールドと一致させることもできます。You can also match the fields returned by the query to the fields of a specified named type. 次のコード例は、データ ソースから選択されたフィールドのデータが設定されたメンバーのコレクションで、匿名型のコレクションを返すクエリ式を示します。The following code example shows a query expression that returns a collection of anonymous types that have members populated with data from the selected fields from the data source.

Dim queryResults = From cust In customers
               Where cust.Country = "Canada"
               Select cust.CompanyName, cust.Country

LINQ クエリを使用して、複数のデータ ソースを結合し、単一の結果を返すこともできます。LINQ queries can also be used to combine multiple sources of data and return a single result. これは、1 つまたは複数の From 句を使用するか、Join クエリ句または Group Join クエリ句を使用して実行できます。This can be done with one or more From clauses, or by using the Join or Group Join query clauses. 次のコード例は、顧客データと注文データを結合し、顧客データと注文データが格納された匿名型のコレクションを返すクエリ式を示します。The following code example shows a query expression that combines customer and order data and returns a collection of anonymous types containing customer and order data.

Dim customers = GetCustomers()
Dim orders = GetOrders()

Dim queryResults = From cust In customers, ord In orders
           Where cust.CustomerID = ord.CustomerID
           Select cust, ord

For Each result In queryResults
    Debug.WriteLine(result.ord.Amount & "  " & result.ord.CustomerID & "  " & result.cust.CompanyName)
Next

' Output:
'   200.00  1  Contoso, Ltd
'   300.00  1  Contoso, Ltd
'   100.00  2  Margie's Travel
'   600.00  3  Fabrikam, Inc.
'   800.00  3  Fabrikam, Inc.

Group Join 句を使用して、顧客オブジェクトのコレクションを格納する階層的なクエリ結果を作成できます。You can use the Group Join clause to create a hierarchical query result that contains a collection of customer objects. 各顧客オブジェクトには、その顧客のすべての注文のコレクションを含むプロパティがあります。Each customer object has a property that contains a collection of all orders for that customer. 次のコード例は、顧客データと注文データを階層的な結果として結合し、匿名型のコレクションを返すクエリ式を示します。The following code example shows a query expression that combines customer and order data as a hierarchical result and returns a collection of anonymous types. このクエリは、顧客の注文データのコレクションを格納する CustomerOrders プロパティを含む型を返します。The query returns a type that includes a CustomerOrders property that contains a collection of order data for the customer. その顧客のすべての注文の合計を格納する OrderTotal プロパティも含まれますIt also includes an OrderTotal property that contains the sum of the totals for all the orders for that customer. (このクエリは、LEFT OUTER JOIN と同等です)。(This query is equivalent to a LEFT OUTER JOIN.)

Dim customers = GetCustomers()
Dim orders = GetOrders()

Dim queryResults = From cust In customers
                   Group Join ord In orders On
                     cust.CustomerID Equals ord.CustomerID
                     Into CustomerOrders = Group,
                          OrderTotal = Sum(ord.Amount)
                   Select cust.CompanyName, cust.CustomerID,
                          CustomerOrders, OrderTotal

For Each result In queryResults
    Debug.WriteLine(result.OrderTotal & "  " & result.CustomerID & "  " & result.CompanyName)
    For Each ordResult In result.CustomerOrders
        Debug.WriteLine("   " & ordResult.Amount)
    Next
Next

' Output:
'   500.00  1  Contoso, Ltd
'      200.00
'      300.00
'   100.00  2  Margie's Travel
'      100.00
'   1400.00  3  Fabrikam, Inc.
'      600.00
'      800.00

上記以外にも、強力なクエリ式を作成するために使用できる、さまざまな LINQ クエリ演算子があります。There are several additional LINQ query operators that you can use to create powerful query expressions. このトピックの次のセクションで、クエリ式で使用できるさまざまなクエリ句について説明します。The next section of this topic discusses the various query clauses that you can include in a query expression. Visual Basic のクエリ句の詳細については、「クエリ」を参照してください。For details about Visual Basic query clauses, see Queries.

LINQ クエリ演算子の Visual BasicVisual Basic LINQ query operators

LINQ クエリをサポートする System.Linq 名前空間とその他の名前空間のクラスには、アプリケーションの要件に基づいてクエリの作成と絞り込みを行うために呼び出すことができるメソッドが含まれています。The classes in the System.Linq namespace and the other namespaces that support LINQ queries include methods that you can call to create and refine queries based on the needs of your application. Visual Basic には、次の一般的なクエリ句のキーワードが含まれています。Visual Basic includes keywords for the following common query clauses. Visual Basic のクエリ句の詳細については、「クエリ」を参照してください。For details about Visual Basic query clauses, see Queries.

From 句From clause

クエリを開始するにAggregateは、 Fromまたは句のいずれかが必要です。Either a From clause or an Aggregate clause is required to begin a query. From 句は、クエリのソース コレクションと反復変数を指定します。A From clause specifies a source collection and an iteration variable for a query. 例:For example:

' Returns the company name for all customers for which
' the Country is equal to "Canada".
Dim names = From cust In customers
            Where cust.Country = "Canada"
            Select cust.CompanyName

Select 句Select clause

任意。Optional. Selectは、クエリの一連の反復変数を宣言します。A Select clause declares a set of iteration variables for a query. 例:For example:

' Returns the company name and ID value for each
' customer as a collection of a new anonymous type.
Dim customerList = From cust In customers
                   Select cust.CompanyName, cust.CustomerID

Select 句の指定がない場合、クエリの反復変数は、From 句または Aggregate 句で指定された反復変数で構成されます。If a Select clause is not specified, the iteration variables for the query consist of the iteration variables specified by the From or Aggregate clause.

Where 句Where clause

任意。Optional. Whereは、クエリのフィルター条件を指定します。A Where clause specifies a filtering condition for a query. 例:For example:

' Returns all product names for which the Category of
' the product is "Beverages".
Dim names = From product In products
            Where product.Category = "Beverages"
            Select product.Name

Order By 句]Order By clause]

|Optional.|Optional. Order Byは、クエリ内の列の並べ替え順序を指定します。An Order By clause specifies the sort order for columns in a query. 例:For example:

' Returns a list of books sorted by price in 
' ascending order.
Dim titlesAscendingPrice = From b In books
                           Order By b.price

Join 句Join clause

任意。Optional. Joinは、2つのコレクションを1つのコレクションに結合します。A Join clause combines two collections into a single collection. 例:For example:

' Returns a combined collection of all of the 
' processes currently running and a descriptive
' name for the process taken from a list of 
' descriptive names.
Dim processes = From proc In Process.GetProcesses
                Join desc In processDescriptions
                  On proc.ProcessName Equals desc.ProcessName
                Select proc.ProcessName, proc.Id, desc.Description

Group By 句Group By clause

任意。Optional. Group Byは、クエリ結果の要素をグループ化します。A Group By clause groups the elements of a query result. 各グループに集計関数を適用するために使用できます。It can be used to apply aggregate functions to each group. 例:For example:

' Returns a list of orders grouped by the order date
' and sorted in ascending order by the order date.
Dim orderList = From order In orders
                Order By order.OrderDate
                Group By OrderDate = order.OrderDate
                Into OrdersByDate = Group

Group Join 句Group Join clause

任意。Optional. Group Joinは、2つのコレクションを1つの階層コレクションに結合します。A Group Join clause combines two collections into a single hierarchical collection. 例:For example:

' Returns a combined collection of customers and
' customer orders.
Dim customerList = From cust In customers
                   Group Join ord In orders On
                     cust.CustomerID Equals ord.CustomerID
                   Into CustomerOrders = Group,
                        TotalOfOrders = Sum(ord.Amount)
                   Select cust.CompanyName, cust.CustomerID,
                          CustomerOrders, TotalOfOrders

Aggregate 句Aggregate clause

クエリを開始するにFromは、 句または句のいずれかが必要です。Aggregate Either an Aggregate clause or a From clause is required to begin a query. Aggregate 句は、1 つ以上の集計関数をコレクションに適用します。An Aggregate clause applies one or more aggregate functions to a collection. たとえば、次の例に示すAggregateように、句を使用して、クエリによって返されるすべての要素の合計を計算できます。For example, you can use the Aggregate clause to calculate a sum for all the elements returned by a query, as the following example does.

' Returns the sum of all order amounts.
Dim orderTotal = Aggregate order In orders
                 Into Sum(order.Amount)

Aggregate 句を使用してクエリを変更することもできます。You can also use the Aggregate clause to modify a query. たとえば、Aggregate 句を使用して、関連するクエリ コレクションに対して計算を実行できます。For example, you can use the Aggregate clause to perform a calculation on a related query collection. 例:For example:

' Returns the customer company name and largest 
' order amount for each customer.
Dim customerMax = From cust In customers
                  Aggregate order In cust.Orders
                  Into MaxOrder = Max(order.Amount)
                  Select cust.CompanyName, MaxOrder

Let 句Let clause

任意。Optional. Letは、値を計算し、それをクエリの新しい変数に代入します。A Let clause computes a value and assigns it to a new variable in the query. 例:For example:

' Returns a list of products with a calculation of
' a ten percent discount.
Dim discountedProducts = From prod In products
                         Let Discount = prod.UnitPrice * 0.1
                         Where Discount >= 50
                         Select prod.Name, prod.UnitPrice, Discount

Distinct 句Distinct clause

任意。Optional. Distinctでは、現在の反復変数の値を制限して、クエリ結果内の重複する値を除去します。A Distinct clause restricts the values of the current iteration variable to eliminate duplicate values in query results. 例:For example:

' Returns a list of cities with no duplicate entries.
Dim cities = From item In customers
             Select item.City
             Distinct

Skip 句Skip clause

任意。Optional. Skipは、コレクション内の指定された数の要素をバイパスし、残りの要素を返します。A Skip clause bypasses a specified number of elements in a collection and then returns the remaining elements. 例:For example:

' Returns a list of customers. The first 10 customers
' are ignored and the remaining customers are
' returned.
Dim customerList = From cust In customers
                   Skip 10

Skip While 句Skip While clause

任意。Optional. Skip Whileは、指定された条件がtrueである限り、コレクションの要素をバイパスし、残りの要素を返します。A Skip While clause bypasses elements in a collection as long as a specified condition is true and then returns the remaining elements. 例:For example:

' Returns a list of customers. The query ignores all
' customers until the first customer for whom
' IsSubscriber returns false. That customer and all
' remaining customers are returned.
Dim customerList = From cust In customers
                   Skip While IsSubscriber(cust)

Take 句Take clause

任意。Optional. Takeは、コレクションの先頭から指定された数の連続する要素を返します。A Take clause returns a specified number of contiguous elements from the start of a collection. 例:For example:

' Returns the first 10 customers.
Dim customerList = From cust In customers
                   Take 10

Take While 句Take While clause

任意。Optional. 指定された条件がである限り、 true 句にはコレクション内の要素が含まれ、残りの要素はバイパスされます。Take While A Take While clause includes elements in a collection as long as a specified condition is true and bypasses the remaining elements. 例:For example:

' Returns a list of customers. The query returns
' customers until the first customer for whom 
' HasOrders returns false. That customer and all 
' remaining customers are ignored.
Dim customersWithOrders = From cust In customers
                          Order By cust.Orders.Count Descending
                          Take While HasOrders(cust)

追加の LINQ クエリ機能を使用するUse additional LINQ query features

LINQ によって提供される列挙可能でクエリ可能な型のメンバーを呼び出すことで、追加の LINQ クエリ機能を使用できます。You can use additional LINQ query features by calling members of the enumerable and queryable types provided by LINQ. これらの追加機能は、クエリ式の結果に対して特定のクエリ演算子を呼び出すことで使用できます。You can use these additional capabilities by calling a particular query operator on the result of a query expression. たとえば、次の例では、 Enumerable.Unionメソッドを使用して、2つのクエリの結果を1つのクエリ結果に結合しています。For example, the following example uses the Enumerable.Union method to combine the results of two queries into one query result. また、Enumerable.ToList メソッドを使用して、クエリ結果をジェネリック リストとして返します。It uses the Enumerable.ToList method to return the query result as a generic list.

Public Function GetAllCustomers() As List(Of Customer)
    Dim customers1 = From cust In domesticCustomers
    Dim customers2 = From cust In internationalCustomers

    Dim customerList = customers1.Union(customers2)

    Return customerList.ToList()
End Function

その他の LINQ 機能の詳細については、「標準クエリ演算子の概要」を参照してください。For details about additional LINQ capabilities, see Standard Query Operators Overview.

LINQ to SQL を使用してデータベースに接続するConnect to a database by using LINQ to SQL

Visual Basic では、LINQ to SQL ファイルを使用してアクセスする SQL Server データベースオブジェクト (テーブル、ビュー、ストアドプロシージャなど) を指定します。In Visual Basic, you identify the SQL Server database objects, such as tables, views, and stored procedures, that you want to access by using a LINQ to SQL file. LINQ to SQL ファイルには、.dbml という拡張子が付きます。A LINQ to SQL file has an extension of .dbml.

SQL Server データベースへの有効な接続がある場合は、 LINQ to SQL クラス項目テンプレートをプロジェクトに追加できます。When you have a valid connection to a SQL Server database, you can add a LINQ to SQL Classes item template to your project. これを行うと、オブジェクト リレーショナル デザイナー (O/R デザイナー) が表示されます。This will display the Object Relational Designer (O/R designer). O/R デザイナーを使用すると、コード内でアクセスする項目をサーバーエクスプローラー/データベースエクスプローラーからデザイナー画面にドラッグできます。The O/R Designer enables you to drag the items that you want to access in your code from the Server Explorer/Database Explorer onto the designer surface. LINQ to SQL ファイルは、DataContext オブジェクトをプロジェクトに追加します。The LINQ to SQL file adds a DataContext object to your project. このオブジェクトには、アクセスするテーブルとビューのプロパティおよびコレクションと、呼び出すストアド プロシージャのメソッドが格納されます。This object includes properties and collections for the tables and views that you want access to, and methods for the stored procedures that you want to call. 変更を LINQ to SQL (.dbml) ファイルに保存した後、O/R デザイナーで定義された DataContext オブジェクトを参照することで、コード内でこれらのオブジェクトにアクセスできます。After you have saved your changes to the LINQ to SQL (.dbml) file, you can access these objects in your code by referencing the DataContext object that is defined by the O/R Designer. プロジェクトの DataContext オブジェクトには、LINQ to SQL ファイルの名前に基づいて名前が付けられます。The DataContext object for your project is named based on the name of your LINQ to SQL file. たとえば、Northwind.dbml という名前の LINQ to SQL ファイルの場合は、DataContext という名前の NorthwindDataContext オブジェクトが作成されます。For example, a LINQ to SQL file that is named Northwind.dbml will create a DataContext object named NorthwindDataContext.

詳細な手順が記載される例については、「方法:データベースに対してクエリを実行し、次の操作を行います。ストアドプロシージャを呼び出します。For examples with step-by-step instructions, see How to: Query a Database and How to: Call a Stored Procedure.

LINQ をサポートする Visual Basic 機能Visual Basic features that support LINQ

Visual Basic には、LINQ の使用を単純化し、LINQ クエリを実行するために記述する必要があるコードの量を減らすための重要な機能が含まれています。Visual Basic includes other notable features that make the use of LINQ simple and reduce the amount of code that you must write to perform LINQ queries. 次に例を示します。These include the following:

  • 匿名型。これにより、クエリ結果に基づいて新しい型を作成できます。Anonymous types, which enable you to create a new type based on a query result.

  • 暗黙的に型指定された変数。型の指定を遅らせ、クエリ結果に基づいてコンパイラが型を推論できるようにします。Implicitly typed variables, which enable you to defer specifying a type and let the compiler infer the type based on the query result.

  • 拡張メソッド。型自体を変更せずに、独自のメソッドで既存の型を拡張することができます。Extension methods, which enable you to extend an existing type with your own methods without modifying the type itself.

詳細については、「 LINQ をサポートする Visual Basic 機能」を参照してください。For details, see Visual Basic Features That Support LINQ.

クエリの遅延実行と即時実行Deferred and immediate query execution

クエリの実行とクエリの作成は分離しています。Query execution is separate from creating a query. クエリを作成した後、その実行は、別のメカニズムによってトリガーされます。After a query is created, its execution is triggered by a separate mechanism. クエリは、定義直後 (即時実行) に実行することも、定義を保存し、後でクエリを実行することもできます (遅延実行)。A query can be executed as soon as it is defined (immediate execution), or the definition can be stored and the query can be executed later (deferred execution).

既定では、クエリを作成しても、クエリ自体が直ちに実行されることはありません。By default, when you create a query, the query itself does not execute immediately. 代わりに、クエリ結果を参照するために使用される変数にクエリ定義が格納されます。Instead, the query definition is stored in the variable that is used to reference the query result. そのクエリ結果変数が、後でコード内の For…Next ループなどでアクセスされると、クエリが実行されます。When the query result variable is accessed later in code, such as in a For…Next loop, the query is executed. このプロセスを遅延実行と呼びます。This process is referred to as deferred execution.

クエリは、定義されている場合にも実行できます。これは即時実行と呼ばれます。Queries can also be executed when they are defined, which is referred to as immediate execution. 即時実行は、クエリ結果の個々の要素にアクセスする必要があるメソッドを適用することで開始できます。You can trigger immediate execution by applying a method that requires access to individual elements of the query result. CountSumAverageMinMax などの集計関数を含めることで、この結果を得ることができます。This can be the result of including an aggregate function, such as Count, Sum, Average, Min, or Max. 集計関数の詳細については、「 Aggregate 句」を参照してください。For more information about aggregate functions, see Aggregate Clause.

ToList メソッドまたは ToArray メソッドを使用することでも、即時実行を開始できます。Using the ToList or ToArray methods will also force immediate execution. これは、クエリを直ちに実行し、結果をキャッシュする場合に役に立ちます。This can be useful when you want to execute the query immediately and cache the results. これらのメソッドの詳細については、「データ型の変換」を参照してください。For more information about these methods, see Converting Data Types.

クエリ実行の詳細については、「初めてのLINQ クエリの作成」を参照してください。For more information about query execution, see Writing Your First LINQ Query.

Visual Basic における XMLXML in Visual Basic

Visual Basic の XML 機能には、xml リテラルと XML 軸プロパティが含まれています。これにより、コード内の XML の作成、アクセス、クエリ、および変更を簡単に行うことができます。The XML features in Visual Basic include XML literals and XML axis properties, which enable you easily to create, access, query, and modify XML in your code. XML リテラルを使用すると、XML をコード内に直接記述できます。XML literals enable you to write XML directly in your code. Visual Basic コンパイラは、XML を、最初のクラスのデータ オブジェクトとして処理します。The Visual Basic compiler treats the XML as a first-class data object.

次のコード例は、XML 要素を作成し、そのサブ要素と属性にアクセスし、LINQ を使用してその要素の内容を照会する方法を示しています。The following code example shows how to create an XML element, access its sub-elements and attributes, and query the contents of the element by using LINQ.

' Place Imports statements at the top of your program.  
Imports <xmlns:ns="http://SomeNamespace">

Module Sample1

    Sub SampleTransform()

        ' Create test by using a global XML namespace prefix. 

        Dim contact = 
            <ns:contact>
                <ns:name>Patrick Hines</ns:name>
                <ns:phone ns:type="home">206-555-0144</ns:phone>
                <ns:phone ns:type="work">425-555-0145</ns:phone>
            </ns:contact>

        Dim phoneTypes = 
          <phoneTypes>
              <%= From phone In contact.<ns:phone> 
                  Select <type><%= phone.@ns:type %></type> 
              %>
          </phoneTypes>

        Console.WriteLine(phoneTypes)
    End Sub

End Module

詳細については、「 XML」を参照してください。For more information, see XML.

トピックTopic 説明Description
XMLXML Visual Basic の XML 機能について説明します。この機能を使用すると、クエリを実行したり、Visual Basic コードに XML をファーストクラスのデータオブジェクトとして含めることができます。Describes the XML features in Visual Basic that can be queried and that enable you to include XML as first-class data objects in your Visual Basic code.
クエリQueries Visual Basic で使用できるクエリ句に関するリファレンス情報を提供します。Provides reference information about the query clauses that are available in Visual Basic.
統合言語クエリ (LINQ)LINQ (Language-Integrated Query) LINQ の概要、プログラミング ガイド、およびサンプルを示します。Includes general information, programming guidance, and samples for LINQ.
LINQ to SQLLINQ to SQL LINQ to SQL の概要、プログラミング ガイド、およびサンプルを示します。Includes general information, programming guidance, and samples for LINQ to SQL.
LINQ to ObjectsLINQ to Objects LINQ to Objects の概要、プログラミング ガイド、およびサンプルを示します。Includes general information, programming guidance, and samples for LINQ to Objects.
LINQ to ADO.NET (ポータル ページ)LINQ to ADO.NET (Portal Page) LINQ to ADO.NET の一般的な情報、プログラミングガイド、およびサンプルへのリンクが含まれています。Includes links to general information, programming guidance, and samples for LINQ to ADO.NET.
LINQ to XMLLINQ to XML LINQ to XML の概要、プログラミング ガイド、およびサンプルを示します。Includes general information, programming guidance, and samples for LINQ to XML.

方法とチュートリアルのトピックHow to and walkthrough topics

方法:データベースのクエリHow to: Query a Database

方法:ストアドプロシージャを呼び出すHow to: Call a Stored Procedure

方法:データベース内のデータの変更How to: Modify Data in a Database

方法:結合を使用したデータの結合How to: Combine Data with Joins

方法:クエリ結果の並べ替えHow to: Sort Query Results

方法:クエリ結果のフィルター処理How to: Filter Query Results

方法:カウント、合計、または平均データHow to: Count, Sum, or Average Data

方法:クエリ結果の最小値または最大値の検索How to: Find the Minimum or Maximum Value in a Query Result

方法:更新、挿入、および削除を実行するストアド プロシージャを割り当てる (O/R デザイナー)How to: Assign stored procedures to perform updates, inserts, and deletes (O/R Designer)

第17章:プログラミングにおける LINQ Visual Basic 2008Chapter 17: LINQ in Programming Visual Basic 2008

関連項目See also