Select 子句 (Visual Basic)
定义查询的结果。
语法
Select [ var1 = ] fieldName1 [, [ var2 = ] fieldName2 [...] ]
组成部分
var1
可选。 别名,可用于引用列表达式的结果。
fieldName1
必需。 要在查询结果中返回的字段的名称。
注解
可以使用 Select
子句来定义要从查询返回的结果。 这使您可以定义由查询创建的新匿名类型的成员,或指定查询所返回的命名类型的成员。 查询不需要 Select
子句。 如果未指定 Select
子句,则查询将返回基于为当前范围标识的范围变量的所有成员的类型。 有关详细信息,请参阅匿名类型。 当查询创建命名类型时,它将返回 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