如何以及何时翻译和评估LINQ查询?

The*_*ght 6 c# sql linq asp.net lambda

我有一个LINQ to SQL Query如下:

var carIds = from car in _db.Cars
           where car.Color == 'Blue'
           select car.Id;
Run Code Online (Sandbox Code Playgroud)

以上将最终翻译成下面的sql:

select Id from Cars 
where Color = 'Blue'
Run Code Online (Sandbox Code Playgroud)

我读过这些阶段是:

  1. LINQ to Lambda Expression
  2. Lambda表达式到表达式树
  3. 表达式树到SQL语句
  4. SQL语句被执行

所以,我的问题是何时以及如何翻译和执行?

我知道第4阶段发生在运行时,我的"carIds"变量在foreach循环中被访问.

foreach(var carId in carIds) // here?
{
  Console.Writeline(carId) // or here?
}
Run Code Online (Sandbox Code Playgroud)

其他阶段呢?他们什么时候发生?在编译时或运行时?在哪一行(定义上或定义之后,访问时或访问之前)?

Ada*_*Dev 3

您所说的是延迟执行- 本质上,linq to SQL 查询将在您尝试枚举结果时执行(例如迭代它,.ToArray() it 等)。

在您的示例中,该语句在以下行执行:

foreach(var carId in carIds)
Run Code Online (Sandbox Code Playgroud)

请参阅有关LINQ 和延迟执行的 MSDN 文章