【问题标题】:Why do "linq to sql" queries starts with the FROM keyword unlike regular SQL queries?为什么“linq to sql”查询与常规 SQL 查询不同,以 FROM 关键字开头?
【发布时间】:2015-12-16 13:43:06
【问题描述】:

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

【问题讨论】:

  • 如果您在编写 SQL 语句时使用了一些智能感知提供程序(即:Apex SQL Complete、Redgate SQL 提示符或带有最新版本 SQL 服务器的 SSMS),您会看到智能感知无法建议您一些东西,直到它到达“来自” - 选择*来自。如果经典 SQL 以“from”开头,那么您也会在那里拥有智能感知。当“智能感知”不存在时这不是问题,但使用 .Net 智能感知在代码编写中起着重要作用。

标签: c# sql .net linq-to-sql


【解决方案1】:

LINQ 在你的 SQL 中模仿 Logical Query processing

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

但实际上它是这样执行的:

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

许多人没有意识到这一点,并犯了简单的错误,例如:

SELECT col AS alias_name
FROM tab
WHERE aliass_name > 10;

并询问为什么它不起作用。因为他们假设订单就像他们写的一样。 LINQ 更擅长这件事。

另见Logical Query ProcessingBOL

SELECT 语句的逻辑处理顺序

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

FROM

ON

JOIN

WHERE

GROUP BY

WITH CUBE or WITH ROLLUP

HAVING

SELECT

DISTINCT

ORDER BY

TOP

【讨论】:

  • 在第一章的T-SQL Querying by Itzik Ben-Gan, Adam Machanic, Dejan Sarka, Kevin Farlee一书中有很好的解释为什么它必须按这个顺序。
【解决方案2】:

有关您的问题的一些文档可在here 获得,他们说It is more similar to "foreach"。不过,this 是一个很好的起点,可以帮助您了解什么是 LINQ 和不同类型的 LINQ。

您通常会在任何地方找到以下类型的 LINQ。 Read here.

  1. LINQ(Linq 到对象)
  2. DLINQ(Linq to SQL)
  3. XLINQ(Linq 到 XML)

【讨论】:

    猜你喜欢
    • 2010-10-03
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多