为什么"linq to sql"查询以与常规SQL查询不同的FROM关键字开头?

Joe*_*Joe 4 .net c# sql linq-to-sql

为什么linq to sql查询以FROM与常规SQL查询不同的关键字开头?

Luk*_*zda 8

LINQ模仿Logical Query processingSQL你有:

8. SELECT
9. DISTINCT
11. TOP
1. FROM
2. ON
3. JOIN
4. WHERE
5. GROUP BY
6. WITH CUBE/ROLLUP
7. HAVING
10. ORDER BY
12. OFFSET/FETCH
Run Code Online (Sandbox Code Playgroud)

但实际上它执行如下:

1. FROM
2. ON
3. JOIN
4. WHERE
5. GROUP BY
6. WITH CUBE/ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10. ORDER BY
11. TOP
12. OFFSET/FETCH
Run Code Online (Sandbox Code Playgroud)

很多人都没有意识到这一点,并犯了一些简单的错误:

SELECT col AS alias_name
FROM tab
WHERE aliass_name > 10;
Run Code Online (Sandbox Code Playgroud)

并问为什么它不起作用.因为他们认为订单就像他们写的那样.LINQ在这件事上更好.

另请参阅逻辑查询处理BOL:

SELECT语句的逻辑处理顺序

以下步骤显示SELECT语句的逻辑处理顺序或绑定顺序.此顺序确定在一个步骤中定义的对象何时可用于后续步骤中的子句.例如,如果查询处理器可以绑定(访问)FROM子句中定义的表或视图,则这些对象及其列可供所有后续步骤使用.相反,因为SELECT子句是步骤8,所以前面的子句不能引用该子句中定义的任何列别名或派生列.但是,它们可以由后续子句引用,例如ORDER BY子句.请注意,语句的实际物理执行由查询处理器确定,并且顺序可能与此列表不同.

FROM

ON

JOIN

WHERE

GROUP BY

WITH CUBE or WITH ROLLUP

HAVING

SELECT

DISTINCT

ORDER BY

TOP
Run Code Online (Sandbox Code Playgroud)