【VB.NET】LINQ(クエリ構文)の要点だけ説明します。

VB.NET
この記事は約11分で読めます。

LINQ(クエリ構文)の要点だけ説明します。

クエリ式と言ったりクエリ構文と言ったしますが同じ事です。なんとなくですがクエリ式が多いような気もします。

クエリ構文は最低でも「from」、「in」、「select」の3つのキーワードが必要で、条件句である「where」を足した4大キーワードで構成されます。

そもそもLINQとは何か?

「Language-Integrated Query」の略で日本語だと「統合言語クエリ」とかそんな感じの意味です。

SQL言語のクエリとプログラミング言語のVB.NETを統合した技術という理解で良いと思います。

LINQを使用しない

Module Module1

    Sub Main()
        Dim numbers = New Integer() {1, 3, 4, 2, 5}

        For Each it In numbers
            Console.WriteLine(it)
        Next
    End Sub

End Module
1
3
4
2
5
続行するには何かキーを押してください . . .

にんてん
にんてん

配列を出力しているだけです。

基本的なLINQを使用

Module Module1

    Sub Main()
        Dim numbers = New Integer() {1, 3, 4, 2, 5}

        'LINQ
        Dim selectNums = From n In numbers
                         Select n

        For Each it In selectNums
            Console.WriteLine(it)
        Next
    End Sub

End Module

1
3
4
2
5
続行するには何かキーを押してください . . .
にんてん
にんてん

結果は変わっていませんがLINQに

処理をさせてます。

LINQを使用して結果を加工する

Module Module1

    Sub Main()
        Dim numbers = New Integer() {1, 3, 4, 2, 5}

        'LINQ
        Dim selectNums = From n In numbers
                         Select String.Format("{0}を2倍したら「{1}」です", n, n * 2)

        For Each it In selectNums
            Console.WriteLine(it)
        Next
    End Sub

End Module
1を2倍したら「2」です
3を2倍したら「6」です
4を2倍したら「8」です
2を2倍したら「4」です
5を2倍したら「10」です
続行するには何かキーを押してください . . .

LINQを使用して条件を指定する(フィルタリング)

Module Module1

    Sub Main()
        Dim numbers = Enumerable.Range(1, 9)

        'LINQ
        Dim query = From n In numbers
                    Where n Mod 2 = 0
                    Select n

        For Each it In query
            Console.WriteLine(it)
        Next
    End Sub

End Module
2
4
6
8
続行するには何かキーを押してください . . .

LINQを使用して複数条件を指定する(フィルタリング)

Module Module1

    Sub Main()
        Dim numbers = New Integer() {1, 3, 4, 2, 5}

        'LINQ
        Dim selectNums = From n In numbers
                         Where n >= 3
                         Where n Mod 2 = 0
                         Select n

        For Each it In selectNums
            Console.WriteLine(it)
        Next
    End Sub

End Module
4
続行するには何かキーを押してください . . .

LINQを使用してLIKE句で条件を指定する(フィルタリング)

Module Module1

    Sub Main()
        Dim array = New String() {"みかん", "りんご", "パイナップル"}

        'LINQ
        Dim query = From n In array
                    Where n Like "*ん*"
                    Select n

        For Each it In query
            Console.WriteLine(it)
        Next
    End Sub

End Module
/pre>
みかん
りんご
続行するには何かキーを押してください . . .

LINQを使用して並べかえる(昇順)

Module Module1

    Sub Main()
        Dim numbers = New Integer() {1, 3, 4, 2, 5}

        'LINQ
        Dim selectNums = From n In numbers
                         Order By n
                         Select n

        For Each it In selectNums
            Console.WriteLine(it)
        Next
    End Sub

End Module

1
2
3
4
5
続行するには何かキーを押してください . . .

LINQを使用して並べかえる(降順)

Module Module1

    Sub Main()
        Dim numbers = New Integer() {1, 3, 4, 2, 5}

        'LINQ
        Dim selectNums = From n In numbers
                         Order By n Descending
                         Select n

        For Each it In selectNums
            Console.WriteLine(it)
        Next
    End Sub

End Module
5
4
3
2
1
続行するには何かキーを押してください . . .

LINQを使用して並べかえる(順番指定を複数)

Module Module1

    Sub Main()
        Dim array = New String() {"みかん", "りんご", "パイナップル", "白菜"}

        'LINQ
        Dim query = From n In array
                    Order By n.Length Descending, n
                    Select n.Length, n

        For Each it In query
            Console.WriteLine(it)
        Next
    End Sub

End Module
{ Length = 6, n = パイナップル }
{ Length = 3, n = みかん }
{ Length = 3, n = りんご }
{ Length = 2, n = 白菜 }
続行するには何かキーを押してください . . .
にんてん
にんてん

順番を変えるコードをFor文で書くのは

大変なので積極的に使って行きましょう。

複数のデータソースを参照

Module Module1

    Sub Main()

        'LINQ
        Dim selectNums = From x In Enumerable.Range(1, 9)
                         From y In Enumerable.Range(1, 9)
                         Select x.ToString() + "×" + y.ToString() + "=" + (x * y).ToString()

        For Each it In selectNums
            Console.WriteLine(it)
        Next
    End Sub

End Module
1×1=1
1×2=2
1×3=3
1×4=4
...........(中略)
9×7=63
9×8=72
9×9=81
続行するには何かキーを押してください . . .

指定の項目だけ取得

Module Module1

    Class Person
        Public ID As Int32
        Public 名前 As String
        Public 種類 As String

        Public Sub New(ID As Int32, 名前 As String, 種類 As String)
            Me.ID = ID
            Me.名前 = 名前
            Me.種類 = 種類
        End Sub
    End Class

    Sub Main()

        Dim persons() As Person = {
            New Person(1, "りんご", "果物"),
            New Person(2, "みかん", "果物"),
            New Person(3, "サツマイモ", "野菜")
        }

        'LINQ
        Dim selectPersons = From x In persons
                            Where x.種類 = "果物"
                            Where x.名前 Like "*ん*"
                            Select x.ID, x.名前

        For Each it In selectPersons
            Console.WriteLine(it)
        Next
    End Sub

End Module
{ ID = 1, 名前 = りんご }
{ ID = 2, 名前 = みかん }
続行するには何かキーを押してください . . .
にんてん
にんてん

欲しいのは、IDと名前だけ

重複の排除

Module Module1

    Sub Main()
        Dim array = New Integer() {1, 2, 3, 2, 4, 3}

        'LINQ
        Dim query = From n In array
                    Select n Distinct

        For Each it In query
            Console.WriteLine(it)
        Next
    End Sub

End Module
1
2
3
4
続行するには何かキーを押してください . . .

joinで結合

Module Module1

    Sub Main()
        Dim array1 = New Integer() {1, 2, 3, 4, 5}
        Dim array2 = New Integer() {1, 2, 4}

        'LINQ
        Dim query = From x In array1
                    Join y In array2 On x Equals y
                    Select x, y

        For Each it In query
            Console.WriteLine(it)
        Next
    End Sub

End Module
{ x = 1, y = 1 }
{ x = 2, y = 2 }
{ x = 4, y = 4 }
続行するには何かキーを押してください . . .

両方に存在する値のみ取得できます。

コメント

タイトルとURLをコピーしました