Select 子句 (Visual Basic)
定义查询的结果。
Select [ var1 = ] fieldName1 [, [ var2 = ] fieldName2 [...] ]
部件
var1
可选。可用于引用列表达式的结果的别名。fieldName1
必选。要在查询结果中返回的字段的名称。
备注
使用 Select 子句可以定义要从查询中返回的结果。这使您可以定义由查询创建的新匿名类型的成员,或指定由查询返回的命名类型的成员。Select 子句不是查询所必需的。如果未指定 Select 子句,查询将根据为当前范围标识的范围变量的所有成员返回一个类型。有关更多信息,请参见匿名类型 (Visual Basic)。当查询创建命名类型时,它将返回类型为 IEnumerable<T> 的结果,其中 T 为创建的类型。
Select 子句可以引用当前范围中的任何变量。这包括在 From 子句(或 From 子句)中标识的范围变量。它还包括由 Aggregate、Let、Group By 或 Group Join 子句通过别名创建的任何新变量或查询表达式中之前的 Select 子句创建的变量。Select 子句还可以包含静态值。例如,下面的代码示例演示查询表达式,其中,Select 子句将查询结果定义为具有以下四个成员的新匿名类型:ProductName、Price、Discount 和 DiscountedPrice。ProductName 和 Price 成员值取自 From 子句中定义的产品范围变量。DiscountedPrice 成员值是在 Let 子句中计算的。Discount 成员是一个静态值。
' 10% discount
Dim discount_10 = 0.1
Dim priceList =
From product In products
Let DiscountedPrice = product.UnitPrice * (1 - discount_10)
Select product.ProductName, Price = product.UnitPrice,
Discount = discount_10, DiscountedPrice
Select 子句为后续查询子句引入一组新的范围变量,而之前的范围变量不再位于范围中。查询表达式中的最后一个 Select 子句确定查询的返回值。例如,下面的查询返回总数超过 500 的每个客户订单的公司名称和订单 ID。第一个 Select 子句标识了 Where 子句和第二个 Select 子句的范围变量。第二个 Select 子句将查询返回的值标识为新的匿名类型。
Dim customerList = From cust In customers, ord In cust.Orders
Select Name = cust.CompanyName,
Total = ord.Total, ord.OrderID
Where Total > 500
Select Name, OrderID
如果 Select 子句标识了要返回的单个项,则查询表达式将返回该项的类型集合。如果 Select 子句标识了要返回的多个项,则查询表达式根据所选项返回新匿名类型的集合。例如,下面两个查询根据 Select 子句返回两个不同类型的集合。第一个查询返回字符串形式的公司名称的集合。第二个查询返回用公司名称和地址信息填充的 Customer 对象的集合。
Dim customerNames = From cust In customers
Select cust.CompanyName
Dim customerInfo As IEnumerable(Of Customer) =
From cust In customers
Select New Customer With {.CompanyName = cust.CompanyName,
.Address = cust.Address,
.City = cust.City,
.Region = cust.Region,
.Country = cust.Country}
示例
下面的查询表达式使用 From 子句为 customers 集合声明范围变量 cust。Select 子句选择客户名称和 ID 值,并填充新范围变量的 CompanyName 和 CustomerID 列。For Each 语句循环访问返回的每个对象,并显示每条记录的 CompanyName 和 CustomerID 列。
Sub SelectCustomerNameAndId(ByVal customers() As Customer)
Dim nameIds = From cust In customers
Select cust.CompanyName, cust.CustomerID
For Each nameId In nameIds
Console.WriteLine(nameId.CompanyName & ": " & nameId.CustomerID)
Next
End Sub