C# LinQ延迟执行查询是按顺序运行,还是作为所有等待操作的编译

C# LinQ延迟执行查询是按顺序运行,还是作为所有等待操作的编译,c#,linq,C#,Linq,当执行ToList时,Linq会选择所有结果,然后对Where谓词进行第二次迭代测试所有结果吗?或者LinQ会将Where与第一个Select组合起来,并且只迭代一次吗?这可能是第一种方式,也可能是第二种方式,具体取决于某些情况 例如,如果您的查询被转换为数据库(并且您从IQueryable中进行选择),那么您的两个分配很可能合并为一个。如果源的类型为IEnumerable,则它将简单地迭代应用where条件的所有结果 在这两种情况下,LinQ都将迭代集合两次它设计为只迭代序列一次 “迭代”两次

当执行ToList时,Linq会选择所有结果,然后对Where谓词进行第二次迭代测试所有结果吗?或者LinQ会将Where与第一个Select组合起来,并且只迭代一次吗?

这可能是第一种方式,也可能是第二种方式,具体取决于某些情况

例如,如果您的查询被转换为数据库(并且您从
IQueryable
中进行选择),那么您的两个分配很可能合并为一个。如果源的类型为
IEnumerable
,则它将简单地迭代应用where条件的所有结果

在这两种情况下,LinQ都将迭代集合两次它设计为只迭代序列一次


“迭代”两次的唯一方法是执行两次查询,例如调用
ToList
或运行
foreach

如果你的问题只是关于第二个LINQ,你可能会对发布第一个LINQ的目的感兴趣。@har07我想知道,将导致表的双重迭代。
var results = from r in resultTable
              select r;

results = from results 
          where r.name == "somename"
          select r;

results = results.ToList();