次の方法で共有


基本的なクエリ操作 (Visual Basic)

このトピックでは、Visual Basic の Language-Integrated クエリ (LINQ) 式と、クエリで実行する一般的な操作の一部について簡単に説明します。 詳細については、次のトピックを参照してください。

Visual Basic での LINQ の概要

クエリ

チュートリアル: Visual Basic でのクエリの記述

データ ソースの指定 (From)

LINQ クエリの最初の手順は、クエリを実行するデータ ソースを指定することです。 したがって、クエリの From 句が常に優先されます。 クエリ演算子は、ソースの種類に基づいて結果を選択して整形します。

Dim query = From cust In customers
'           ...

From句は、データ ソース、customers、および範囲変数custを指定します。 範囲変数はループ反復変数に似ていますが、クエリ式では実際の反復は行われません。 多くの場合、 For Each ループを使用してクエリを実行すると、範囲変数は、 customers内の連続する各要素への参照として機能します。 コンパイラは custの型を推論できるため、明示的に指定する必要はありません。 明示的な型指定の有無にかかわらず記述されるクエリの例については、「 クエリ操作の型リレーションシップ (Visual Basic)」を参照してください。

Visual Basic で From 句を使用する方法の詳細については、「 From 句」を参照してください。

データのフィルター処理 (Where)

おそらく最も一般的なクエリ操作は、ブール式の形式でフィルターを適用することです。 その後、クエリは、式が true の要素のみを返します。 フィルター処理を実行するには、 Where 句を使用します。 フィルターは、結果のシーケンスに含めるデータ ソース内の要素を指定します。 次の例では、ロンドンに住所を持つ顧客のみが含まれています。

Dim londonCusts = From cust In customers
                  Where cust.City = "London"
'                 ...

AndOrなどの論理演算子を使用して、フィルター式をWhere句に結合できます。 たとえば、ロンドン出身で、名前が Devon の顧客のみを返すには、次のコードを使用します。

Where cust.City = "London" And cust.Name = "Devon"

ロンドンまたはパリから顧客を返すには、次のコードを使用します。

Where cust.City = "London" Or cust.City = "Paris"

Visual Basic で Where 句を使用する方法の詳細については、「 Where 句」を参照してください。

データの並べ替え (並べ替え)

多くの場合、返されたデータを特定の順序に並べ替えるのが便利です。 Order By句を指定すると、返されたシーケンス内の要素が、指定したフィールドで並べ替えられます。 たとえば、次のクエリは、 Name プロパティに基づいて結果を並べ替えます。 Nameは文字列であるため、返されるデータはアルファベット順に A から Z に並べ替えられます。

Dim londonCusts1 = From cust In customers
                   Where cust.City = "London"
                   Order By cust.Name Ascending
'                   ...

結果を逆の順序で並べ替える場合は、Z から A まで、 Order By...Descending 句を使用します。 既定値は、AscendingDescendingも指定されていない場合にAscendingされます。

Visual Basic で Order By 句を使用する方法の詳細については、「 Order By 句」を参照してください。

データの選択 (選択)

Select句は、返される要素の形式と内容を指定します。 たとえば、結果が完全な Customer オブジェクト、1 つの Customer プロパティ、プロパティのサブセット、さまざまなデータ ソースのプロパティの組み合わせ、または計算に基づく新しい結果の種類で構成されるかどうかを指定できます。 Select句がソース要素のコピー以外のものを生成する場合、操作はプロジェクションと呼ばれます。

完全な Customer オブジェクトで構成されるコレクションを取得するには、範囲変数自体を選択します。

Dim londonCusts2 = From cust In customers
                   Where cust.City = "London"
                   Order By cust.Name Ascending
                   Select cust

Customer インスタンスが多数のフィールドを持つラージ オブジェクトであり、取得する必要があるのが名前の場合は、次の例に示すようにcust.Nameを選択できます。 ローカル型推論では、結果の型が Customer オブジェクトのコレクションから文字列のコレクションに変更されることを認識します。

Dim londonCusts3 = From cust In customers
                   Where cust.City = "London"
                   Order By cust.Name Ascending
                   Select cust.Name

データ ソースから複数のフィールドを選択するには、次の 2 つの選択肢があります。

  • Select句で、結果に含めるフィールドを指定します。 コンパイラは、それらのフィールドをプロパティとして持つ匿名型を定義します。 詳細については、「 匿名型」を参照してください。

    次の例で返される要素は匿名型のインスタンスであるため、コード内の別の場所で名前で型を参照することはできません。 型のコンパイラ指定名に、通常の Visual Basic コードでは無効な文字が含まれています。 次の例では、 londonCusts4 のクエリによって返されるコレクション内の要素は匿名型のインスタンスです

    Dim londonCusts4 = From cust In customers
                       Where cust.City = "London"
                       Order By cust.Name Ascending
                       Select Name = cust.Name, Phone = cust.Phone
    
    For Each londonCust In londonCusts4
        Console.WriteLine(londonCust.Name & " " & londonCust.Phone)
    Next
    

    -又は-

  • 結果に含める特定のフィールドを含む名前付き型を定義し、 Select 句で型のインスタンスを作成および初期化します。 このオプションは、返されるコレクションの外部で個々の結果を使用する必要がある場合、またはメソッド呼び出しでパラメーターとして渡す必要がある場合にのみ使用します。 次の例の londonCusts5 の種類は IEnumerable(Of NamePhone) です。

    Public Class NamePhone
        Public Name As String
        Public Phone As String
        ' Additional class elements
    End Class
    
    Dim londonCusts5 = From cust In customers
                       Where cust.City = "London"
                       Order By cust.Name Ascending
                       Select New NamePhone With {.Name = cust.Name,
                                                  .Phone = cust.Phone}
    

Visual Basic で Select 句を使用する方法の詳細については、「 Select 句」を参照してください。

データの結合 (結合とグループ結合)

From句では、複数のデータ ソースを複数の方法で組み合わせることができます。 たとえば、次のコードは 2 つのデータ ソースを使用し、両方のプロパティを暗黙的に結果に結合します。 このクエリでは、姓が母音で始まる学生を選択します。

Dim vowels() As String = {"A", "E", "I", "O", "U"}
Dim vowelNames = From student In students, vowel In vowels
                 Where student.Last.IndexOf(vowel) = 0
                 Select Name = student.First & " " &
                 student.Last, Initial = vowel
                 Order By Initial

For Each vName In vowelNames
    Console.WriteLine(vName.Initial & ":  " & vName.Name)
Next

このコードは、「 方法: 項目のリストを作成する」で作成した学生のリストを使用して実行できます。

Join キーワードは、SQL のINNER JOINと同じです。 2 つのコレクション内の要素間の一致するキー値に基づいて、2 つのコレクションを結合します。 クエリは、一致するキー値を持つコレクション要素のすべてまたは一部を返します。 たとえば、次のコードは、前の暗黙的結合のアクションを複製します。

Dim vowelNames2 = From student In students
                  Join vowel In vowels
                  On student.Last(0) Equals vowel
                  Select Name = student.First & " " &
                  student.Last, Initial = vowel
                  Order By Initial

Group Join は、SQL の LEFT JOIN と同様に、コレクションを 1 つの階層コレクションに結合します。 詳細については、「 Join 句 」および 「グループ結合句」を参照してください。

データのグループ化 (グループ化)

Group By句を追加して、要素の 1 つ以上のフィールドに従ってクエリ結果の要素をグループ化できます。 たとえば、次のコードは、クラス年度別に学生をグループ化します。

Dim studentsByYear = From student In students
                     Select student
                     Group By year = student.Year
                     Into Classes = Group

For Each yearGroup In studentsByYear
    Console.WriteLine(vbCrLf & "Year: " & yearGroup.year)
    For Each student In yearGroup.Classes
        Console.WriteLine("   " & student.Last & ", " & student.First)
    Next
Next

方法: 項目のリストを作成する」で作成した学生のリストを使用してこのコードを実行すると、 For Each ステートメントからの出力は次のようになります。

年: ジュニア

タッカー、マイケル

Garcia、Hugo

Garcia、Debra

タッカー、ランス

年: シニア

Omelchenko、スヴェトラナ

長田 美智子

Fakhouri、Fadi

Feng、Hanying

Adams、Terry

年: 新入生

Mortensen、Sven

ガルシア、セザール

次のコードに示すバリエーションは、クラスの年を並べ替え、各年度内の学生を姓で並べ替えます。

Dim studentsByYear2 = From student In students
                      Select student
                      Order By student.Year, student.Last
                      Group By year = student.Year
                      Into Classes = Group

Group Byの詳細については、「グループ化句」を参照してください。

こちらも参照ください