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

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

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在这方面做得更好。

另请参阅逻辑查询处理和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 

有关您的问题的一些文档可以在这里找到 ,他们说它It is more similar to "foreach" 。 但是, 这是一个很好的开始和理解什么是LINQ和不同类型的LINQ的地方。

您通常会在任何地方找到以下类型的LINQ。 在这里阅读

  1. LINQ(Linq to Objects)
  2. DLINQ(Linq to SQL)
  3. XLINQ(Linq to XML)