SELECT (Entity SQL)
指定查询所返回的元素。
SELECT [ ALL | DISTINCT ] [ topSubclause ] aliasedExpr
[{ , aliasedExpr }]
or
SELECT VALUE [ ALL | DISTINCT ] [ topSubclause ] expr
参数
- ALL
指定结果集中可以出现重复项。ALL 为默认值。
- DISTINCT
指定结果集中只能出现唯一的结果。
- VALUE
仅允许指定一个项,且不添加到行包装上。
topSubclause
任何指示从查询返回的首批结果数的有效表达式(形式为 top (expr))。使用 ORDER BY (Entity SQL) 运算符的 LIMIT 参数也可以选择结果集中的前 n 个项。
aliasedExpr
形式如下的表达式:expr as identifier | expr
- expr
文本或表达式。
备注
SELECT 子句在计算 FROM (Entity SQL)、GROUP BY (Entity SQL) 和 HAVING (Entity SQL) 子句之后进行计算。SELECT 子句只能引用当前处于范围内的项(FROM 子句指定的范围或外部范围)。如果指定了 GROUP BY 子句,则仅允许 SELECT 子句引用 GROUP BY 键的别名。仅允许在聚合函数中引用 FROM 子句项。
跟在 SELECT 关键字之后的一个或多个查询表达式的列表称为“选择列表”,更加正式的名称为“投影”。最普通的投影形式为单个查询表达式。如果从集合 collection1
选择一个成员member1
,则会生成 collection1
中每个对象的所有member1
值的新集合(如下面的示例所示)。
SELECT collection1.member1 FROM collection1
例如,如果customers
是类型为 Customer 的集合,且该类型有类型为 string 的属性Name
,则从customers
选择Name
将生成一个字符串集合(如下面的示例所示)。
SELECT customers.Name FROM customers AS c
也可以使用 JOIN 语法(FULL、INNER、LEFT、OUTER、ON 和 RIGHT)。ON 是内部联接的必需语法,但不允许用于交叉联接。
行和值选择子句
Entity SQL 支持 SELECT 子句的两种变体。第一种变体是行选择,由 SELECT 关键字标识,可以用于指定应提取出的一个或多个值。由于返回值的两侧会隐式添加行包装,因此查询表达式的结果始终为行的多集。
行选择中的每个查询表达式都必须指定一个别名。如果不指定别名,Entity SQL 会尝试使用别名生成规则生成别名。
SELECT 子句的另一种变体为值选择,由 SELECT VALUE 关键字标识。该变体仅允许指定一个值,且不添加行包装。
行选择总是可通过 VALUE SELECT 进行表示(如下面的示例所示)。
SELECT 1 AS a, "abc" AS b, a+34 AS c
SELECT VALUE ROW(1 AS a, "abc" AS b, a+34 AS c)
All 和 Distinct 修饰符
Entity SQL 中的两种 SELECT 变体都允许指定 ALL 或 DISTINCT 修饰符。如果指定 DISTINCT 修饰符,则将从查询表达式(直到并包括 SELECT 子句)生成的集合中消除重复项。如果指定 ALL 修饰符,则不消除重复项;ALL 为默认值。
与 Transact-SQL 的区别
与 Transact-SQL 不同,Entity SQL 不支持在 SELECT 子句中使用 * 参数。Entity SQL 允许查询通过从 FROM 子句引用集合别名来提取出完整的记录(如下面的示例所示)。
SELECT * FROM T1, T2
上面的 Transact-SQL 查询表达式在 Entity SQL 中表示如下。
SELECT a1, a2 FROM T1 AS a1, T2 AS a2
示例
下面的 Entity SQL 查询使用 SELECT 运算符指定查询要返回的元素。此查询基于 AdventureWorks 销售模型。若要编译并运行此查询,请执行下列步骤:
将以下查询作为参数传递给
ExecuteStructuralTypeQuery
方法:
SELECT VALUE product FROM AdventureWorksEntities.Product AS product
输出如下所示:
ProductID: 1
Name: Adjustable Race
ProductNumber: AR-5381
MakeFlag: False
ProductID: 2
Name: Bearing Ball
ProductNumber: BA-8327
MakeFlag: False
ProductID: 3
Name: BB Ball Bearing
ProductNumber: BE-2349
MakeFlag: True
ProductID: 4
Name: Headset Ball Bearings
ProductNumber: BE-2908
MakeFlag: False
ProductID: 316
Name: Blade
ProductNumber: BL-2036
MakeFlag: True
...