VB.Net/LINQ/Query
Содержание
- 1 A select statement against object list
 - 2 Convert Linq result to Array
 - 3 Convert Linq result to List
 - 4 Convert query to a list of string
 - 5 Create a query expression
 - 6 Filter by name length
 - 7 Find the cars that are going less than 55 mph, and order by descending PetName
 - 8 Get all cars. Similar to Select * in SQL
 - 9 Get differences
 - 10 Get only the pet names
 - 11 Join Person and Salaries lists to get the max and min salary
 - 12 Join two object lists together
 - 13 Linq Over Array
 - 14 Linq Over int Array
 - 15 Query String Array With Operators
 - 16 Reflector Linq result
 - 17 Select by a Property
 - 18 Select by object id
 - 19 Using where clause to check the first name of a Persion
 
A select statement against object list
  
Imports System.Reflection
Imports System
Public Class Role
    Public ID As Integer
    Public RoleDescription As String
End Class
Public Class Person
    Public ID As Integer
    Public IDRole As Integer
    Public LastName As String
    Public FirstName As String
End Class
Public Class Salary
    Public IDPerson As Integer
    Public Year As Integer
    Public SalaryYear As Double
End Class
Module Module1
    Sub Main()
        Dim people As New List(Of Person)(New Person() { _
            New Person With {.ID = 1, .IDRole = 1, .LastName = "A", .FirstName = "Brad"}, _
            New Person With {.ID = 2, .IDRole = 2, .LastName = "G", .FirstName = "Tom"} _
        })
        Dim roles As New List(Of Role)(New Role() { _
            New Role With {.ID = 1, .RoleDescription = "Manager"}, _
            New Role With {.ID = 2, .RoleDescription = "Developer"} _
        })
        Dim salaries As New List(Of Salary)(New Salary() { _
                New Salary With {.IDPerson = 1, .Year = 2004, .SalaryYear = 10000.0}, _
                New Salary With {.IDPerson = 1, .Year = 2005, .SalaryYear = 15000.0}, _
                New Salary With {.IDPerson = 2, .Year = 2005, .SalaryYear = 15000.0} _
        })
        Dim query = From p In people Select p
    End Sub
End Module
Convert Linq result to Array
  
Option Explicit On
Option Strict On
Module Program
  Sub Main()
    Dim numbers() As Integer = {10, 20, 30, 40, 1, 2, 3, 8}
    Dim subsetAsIntArray() As Integer = (From i In numbers Where i < 10 Select i).ToArray()
  End Sub
End Module
Convert Linq result to List
  
Option Explicit On
Option Strict On
Module Program
  Sub Main()
    Dim numbers() As Integer = {10, 20, 30, 40, 1, 2, 3, 8}
    Dim subsetAsListOfInts As List(Of Integer) = (From i In numbers Where i < 10 Select i).ToList()
  End Sub
End Module
Convert query to a list of string
  
Imports System.Reflection
Imports System
Public Class Role
    Public ID As Integer
    Public RoleDescription As String
End Class
Public Class Person
    Public ID As Integer
    Public IDRole As Integer
    Public LastName As String
    Public FirstName As String
End Class
Public Class Salary
    Public IDPerson As Integer
    Public Year As Integer
    Public SalaryYear As Double
End Class
Module Module1
    Sub Main()
        Dim people As New List(Of Person)(New Person() { _
            New Person With {.ID = 1, .IDRole = 1, .LastName = "A", .FirstName = "Brad"}, _
            New Person With {.ID = 2, .IDRole = 2, .LastName = "G", .FirstName = "Tom"} _
        })
        Dim roles As New List(Of Role)(New Role() { _
            New Role With {.ID = 1, .RoleDescription = "Manager"}, _
            New Role With {.ID = 2, .RoleDescription = "Developer"} _
        })
        Dim salaries As New List(Of Salary)(New Salary() { _
                New Salary With {.IDPerson = 1, .Year = 2004, .SalaryYear = 10000.0}, _
                New Salary With {.IDPerson = 1, .Year = 2005, .SalaryYear = 15000.0}, _
                New Salary With {.IDPerson = 2, .Year = 2005, .SalaryYear = 15000.0} _
        })
        Dim query = From p In people _
            Where p.LastName.Length = 4 _
            Select p.LastName
        Dim names As List(Of String) = query.ToList()
    End Sub
End Module
Create a query expression
  
Imports System.Collections.Generic
Public Class Car
  Public PetName As String = String.Empty
  Public Color As String = String.Empty
  Public Speed As Integer
  Public Make As String = String.Empty
  Public Overloads Overrides Function ToString() As String
    Return String.Format("Make={0}, Color={1}, Speed={2}, PetName={3}", _
      Make, Color, Speed, PetName)
  End Function
End Class
Module Program
  Sub Main()
        Dim myCars As New List(Of Car)(New Car() { _
    New Car With {.PetName = "D", .Color = "Silver", .Speed = 100, .Make = "BMW"}, _
    New Car With {.PetName = "C", .Color = "Tan", .Speed = 90, .Make = "BMW"}, _
    New Car With {.PetName = "B", .Color = "Rust", .Speed = 5, .Make = "Yugo"}, _
    New Car With {.PetName = "A", .Color = "White", .Speed = 43, .Make = "Ford"}})
    Dim fastCars = From c In myCars Where _
      c.Speed > 90 And c.Make = "BMW" Select c
    For Each car In fastCars
      Console.WriteLine("{0} is going too fast!", car.PetName)
    Next
  End Sub
End Module
Filter by name length
  
Imports System.Reflection
Imports System
Public Class Role
    Public ID As Integer
    Public RoleDescription As String
End Class
Public Class Person
    Public ID As Integer
    Public IDRole As Integer
    Public LastName As String
    Public FirstName As String
End Class
Public Class Salary
    Public IDPerson As Integer
    Public Year As Integer
    Public SalaryYear As Double
End Class
Module Module1
    Sub Main()
        Dim people As New List(Of Person)(New Person() { _
            New Person With {.ID = 1, .IDRole = 1, .LastName = "A", .FirstName = "Brad"}, _
            New Person With {.ID = 2, .IDRole = 2, .LastName = "G", .FirstName = "Tom"} _
        })
        Dim roles As New List(Of Role)(New Role() { _
            New Role With {.ID = 1, .RoleDescription = "Manager"}, _
            New Role With {.ID = 2, .RoleDescription = "Developer"} _
        })
        Dim salaries As New List(Of Salary)(New Salary() { _
                New Salary With {.IDPerson = 1, .Year = 2004, .SalaryYear = 10000.0}, _
                New Salary With {.IDPerson = 1, .Year = 2005, .SalaryYear = 15000.0}, _
                New Salary With {.IDPerson = 2, .Year = 2005, .SalaryYear = 15000.0} _
        })
        Dim query = From p In people _
            Where p.LastName.Length = 4 _
            Select p.LastName
        Dim names As String() = query.ToArray()
    End Sub
End Module
Find the cars that are going less than 55 mph, and order by descending PetName
  
Public Class Car
  Public PetName As String = String.Empty
  Public Color As String = String.Empty
  Public Speed As Integer
  Public Make As String = String.Empty
  Public Overloads Overrides Function ToString() As String
    Return String.Format("Make={0}, Color={1}, Speed={2}, PetName={3}", Make, Color, Speed, PetName)
  End Function
End Class
Module Program
  Sub Main()
        Dim myCars As New List(Of Car)(New Car() { _
    New Car With {.PetName = "D", .Color = "Silver", .Speed = 100, .Make = "BMW"}, _
    New Car With {.PetName = "C", .Color = "Tan", .Speed = 90, .Make = "BMW"}, _
    New Car With {.PetName = "B", .Color = "Rust", .Speed = 5, .Make = "Yugo"}, _
    New Car With {.PetName = "A", .Color = "White", .Speed = 43, .Make = "Ford"}})
    Dim subset = From c In myCars _
      Where c.Speed > 55 Order By c.PetName Descending Select c
    Console.WriteLine(vbLf + "Cars going faster than 55, ordered by PetName:")
    For Each c As Car In subset
      Console.WriteLine("Car {0}", c)
    Next
 
  End Sub
End Module
Get all cars. Similar to Select * in SQL
  
Public Class Car
    Public PetName As String = String.Empty
    Public Color As String = String.Empty
    Public Speed As Integer
    Public Make As String = String.Empty
    Public Overloads Overrides Function ToString() As String
        Return String.Format("Make={0}, Color={1}, Speed={2}, PetName={3}", Make, Color, Speed, PetName)
    End Function
End Class
Module Program
    Sub Main()
        Dim myCars As New List(Of Car)(New Car() { _
    New Car With {.PetName = "D", .Color = "Silver", .Speed = 100, .Make = "BMW"}, _
    New Car With {.PetName = "C", .Color = "Tan", .Speed = 90, .Make = "BMW"}, _
    New Car With {.PetName = "B", .Color = "Rust", .Speed = 5, .Make = "Yugo"}, _
    New Car With {.PetName = "A", .Color = "White", .Speed = 43, .Make = "Ford"}})
        Dim allCars = From c In myCars Select c
        For Each c In allCars
            Console.WriteLine("Car: {0}", c)
        Next
    End Sub
End Module
Get differences
  
Public Class Car
    Public PetName As String = String.Empty
    Public Color As String = String.Empty
    Public Speed As Integer
    Public Make As String = String.Empty
    Public Overloads Overrides Function ToString() As String
        Return String.Format("Make={0}, Color={1}, Speed={2}, PetName={3}", _
          Make, Color, Speed, PetName)
    End Function
End Class
Module Program
    Sub Main()
        Dim myCars As New List(Of Car)(New Car() { _
    New Car With {.PetName = "D", .Color = "Silver", .Speed = 100, .Make = "BMW"}, _
    New Car With {.PetName = "C", .Color = "Tan", .Speed = 90, .Make = "BMW"}, _
    New Car With {.PetName = "B", .Color = "Rust", .Speed = 5, .Make = "Yugo"}, _
    New Car With {.PetName = "A", .Color = "White", .Speed = 43, .Make = "Ford"}})
        Dim myCarsName As String() = {"Y", "A", "B"}
        Dim yourCars As String() = {"B", "S", "A"}
        " Find the differences.
        Dim carDiff = (From c In myCarsName Select c) _
          .Except(From c2 In yourCars Select c2)
        For Each s As String In carDiff
            Console.WriteLine(s)
        Next
    End Sub
End Module
Get only the pet names
  
Public Class Car
  Public PetName As String = String.Empty
  Public Color As String = String.Empty
  Public Speed As Integer
  Public Make As String = String.Empty
  Public Overloads Overrides Function ToString() As String
    Return String.Format("Make={0}, Color={1}, Speed={2}, PetName={3}", Make, Color, Speed, PetName)
  End Function
End Class
Module Program
  Sub Main()
        Dim myCars As New List(Of Car)(New Car() { _
    New Car With {.PetName = "D", .Color = "Silver", .Speed = 100, .Make = "BMW"}, _
    New Car With {.PetName = "C", .Color = "Tan", .Speed = 90, .Make = "BMW"}, _
    New Car With {.PetName = "B", .Color = "Rust", .Speed = 5, .Make = "Yugo"}, _
    New Car With {.PetName = "A", .Color = "White", .Speed = 43, .Make = "Ford"}})
    Dim allNames = From c In myCars Select c.PetName
    For Each n In allNames
      Console.WriteLine("Pet Name: {0}", n)
    Next
  End Sub
End Module
Join Person and Salaries lists to get the max and min salary
  
Imports System.Reflection
Imports System
Public Class Role
    Public ID As Integer
    Public RoleDescription As String
End Class
Public Class Person
    Public ID As Integer
    Public IDRole As Integer
    Public LastName As String
    Public FirstName As String
End Class
Public Class Salary
    Public IDPerson As Integer
    Public Year As Integer
    Public SalaryYear As Double
End Class
Module Module1
    Sub Main()
        Dim people As New List(Of Person)(New Person() { _
            New Person With {.ID = 1, .IDRole = 1, .LastName = "A", .FirstName = "Brad"}, _
            New Person With {.ID = 2, .IDRole = 2, .LastName = "G", .FirstName = "Tom"} _
        })
        Dim roles As New List(Of Role)(New Role() { _
            New Role With {.ID = 1, .RoleDescription = "Manager"}, _
            New Role With {.ID = 2, .RoleDescription = "Developer"} _
        })
        Dim salaries As New List(Of Salary)(New Salary() { _
                New Salary With {.IDPerson = 1, .Year = 2004, .SalaryYear = 10000.0}, _
                New Salary With {.IDPerson = 1, .Year = 2005, .SalaryYear = 15000.0}, _
                New Salary With {.IDPerson = 2, .Year = 2005, .SalaryYear = 15000.0} _
        })
        
        Dim query = From p In people, s In salaries _
            Where p.ID = 1 _
            Select s.SalaryYear
        Console.WriteLine("Minimum Salary:")
        Console.WriteLine(query.Min())
        Console.WriteLine("Maximum Salary:")
        Console.WriteLine(query.Max())
    End Sub
End Module
Join two object lists together
  
Imports System.Reflection
Imports System
Public Class Role
    Public ID As Integer
    Public RoleDescription As String
End Class
Public Class Person
    Public ID As Integer
    Public IDRole As Integer
    Public LastName As String
    Public FirstName As String
End Class
Public Class Salary
    Public IDPerson As Integer
    Public Year As Integer
    Public SalaryYear As Double
End Class
Module Module1
    Sub Main()
        Dim people As New List(Of Person)(New Person() { _
            New Person With {.ID = 1, .IDRole = 1, .LastName = "A", .FirstName = "Brad"}, _
            New Person With {.ID = 2, .IDRole = 2, .LastName = "G", .FirstName = "Tom"} _
        })
        Dim roles As New List(Of Role)(New Role() { _
            New Role With {.ID = 1, .RoleDescription = "Manager"}, _
            New Role With {.ID = 2, .RoleDescription = "Developer"} _
        })
        Dim salaries As New List(Of Salary)(New Salary() { _
                New Salary With {.IDPerson = 1, .Year = 2004, .SalaryYear = 10000.0}, _
                New Salary With {.IDPerson = 1, .Year = 2005, .SalaryYear = 15000.0}, _
                New Salary With {.IDPerson = 2, .Year = 2005, .SalaryYear = 15000.0} _
        })
        Dim query = From p In people, r In roles _
            Where p.ID = 1 AndAlso r.ID = p.IDRole _
            Select New With {p.FirstName, p.LastName, r.RoleDescription}
    End Sub
End Module
Linq Over Array
  
Option Explicit On
Option Strict On
Module Program
    Sub Main()
        Dim currentVideoGames As String() = {"A", "B", "C", "this is a test", "D", "E"}
        Dim subset As IEnumerable(Of String) = From game In currentVideoGames Where game.Length > 6 Order By game Select game
        For Each s As String In subset
            Console.WriteLine("Item: {0}", s)
        Next
    End Sub
End Module
Linq Over int Array
  
Option Explicit On
Option Strict On
Module Program
  Sub Main()
    Dim numbers() As Integer = {10, 20, 30, 40, 1, 2, 3, 8}
    Dim subset = From i In numbers Where i < 10 Select i
    For Each i In subset
      Console.WriteLine("{0} < 10", i)
    Next
    numbers(0) = 4
    For Each i In subset
      Console.WriteLine("{0} < 10", i)
    Next
    Console.WriteLine(subset.GetType().Name)
    Console.WriteLine(subset.GetType().Assembly)
  End Sub
End Module
Query String Array With Operators
  
Module Program
    Sub Main()
        Dim currentVideoGames As String() = {"A", "B", "this is a test", "C", "D", "E"}
        Dim searchFilter As New Func(Of String, Boolean)(AddressOf Filter)
        Dim itemToProcess As New Func(Of String, String)(AddressOf ProcessItem)
        Dim subset = currentVideoGames.Where(searchFilter).OrderBy(itemToProcess).Select(itemToProcess)
        For Each game In subset
            Console.WriteLine("Item: {0}", game)
        Next
    End Sub
    Function Filter(ByVal str As String) As Boolean
        Return str.Length > 6
    End Function
    Function ProcessItem(ByVal str As String) As String
        Return str
    End Function
End Module
Reflector Linq result
  
Option Explicit On
Option Strict On
Module Program
  Sub Main()
    Dim numbers() As Integer = {10, 20, 30, 40, 1, 2, 3, 8}
    Dim subset = From i In numbers Where i < 10 Select i
    For Each i In subset
      Console.WriteLine("{0} < 10", i)
    Next
    numbers(0) = 4
    For Each i In subset
      Console.WriteLine("{0} < 10", i)
    Next
    Console.WriteLine(subset.GetType().Name)
    Console.WriteLine(subset.GetType().Assembly)
  End Sub
End Module
Select by a Property
  
Public Class Car
  Public PetName As String = String.Empty
  Public Color As String = String.Empty
  Public Speed As Integer
  Public Make As String = String.Empty
  Public Overloads Overrides Function ToString() As String
    Return String.Format("Make={0}, Color={1}, Speed={2}, PetName={3}", Make, Color, Speed, PetName)
  End Function
End Class
Module Program
  Sub Main()
    Dim myCars As New List(Of Car)(New Car() { _
    New Car With {.PetName = "D", .Color = "Silver", .Speed = 100, .Make = "BMW"}, _
    New Car With {.PetName = "C", .Color = "Tan", .Speed = 90, .Make = "BMW"}, _
    New Car With {.PetName = "B", .Color = "Rust", .Speed = 5, .Make = "Yugo"}, _
    New Car With {.PetName = "A", .Color = "White", .Speed = 43, .Make = "Ford"}})
    Dim onlyBMWs = From c In myCars Where c.Make = "BMW" Select c
    For Each n In onlyBMWs
      Console.WriteLine("Name: {0}", n)
    Next
  End Sub
End Module
Select by object id
  
Imports System.Collections.Generic
Imports System.Linq
Imports System.Runtime.rupilerServices
Public Class Person
    Public ID As Integer
    Public IDRole As Integer
    Public LastName As String
    Public FirstName As String
End Class
Module Module1
    Sub Main()
        Dim people As New List(Of Person)(New Person() { _
            New Person With {.ID = 1, .IDRole = 1, .LastName = "A", .FirstName = "Brad"}, _
            New Person With {.ID = 2, .IDRole = 2, .LastName = "G", .FirstName = "Tom"} _
        })
        Dim query = From p In people Where p.ID = 1 Select p
    End Sub
End Module
Using where clause to check the first name of a Persion
  
Imports System.Reflection
Imports System
Public Class Role
    Public ID As Integer
    Public RoleDescription As String
End Class
Public Class Person
    Public ID As Integer
    Public IDRole As Integer
    Public LastName As String
    Public FirstName As String
End Class
Public Class Salary
    Public IDPerson As Integer
    Public Year As Integer
    Public SalaryYear As Double
End Class
Module Module1
    Sub Main()
        Dim people As New List(Of Person)(New Person() { _
            New Person With {.ID = 1, .IDRole = 1, .LastName = "A", .FirstName = "Brad"}, _
            New Person With {.ID = 2, .IDRole = 2, .LastName = "G", .FirstName = "Tom"} _
        })
        Dim roles As New List(Of Role)(New Role() { _
            New Role With {.ID = 1, .RoleDescription = "Manager"}, _
            New Role With {.ID = 2, .RoleDescription = "Developer"} _
        })
        Dim salaries As New List(Of Salary)(New Salary() { _
                New Salary With {.IDPerson = 1, .Year = 2004, .SalaryYear = 10000.0}, _
                New Salary With {.IDPerson = 1, .Year = 2005, .SalaryYear = 15000.0}, _
                New Salary With {.IDPerson = 2, .Year = 2005, .SalaryYear = 15000.0} _
        })
        Dim query = From p In people Where p.FirstName = "B" Select p
    End Sub
End Module