我的理解是使用标量或转换函数会立即执行LINQ查询。我的理解是,子查询是根据外部查询的要求执行的,通常每个元素一次。对于以下示例,我是否正确地说内部查询是立即执行的?如果是这样,因为这将产生一个标量值,这将如何影响外部查询的运作方式?
IEnumerable<string> outerQuery = names.Where ( n => n.Length == names
.OrderBy(n2 => n2.Length).Select(n2 => n2.Length).First());
我希望上面的查询以类似的方式运行,即好像没有子查询。
int val = names.OrderBy(n2 => n2.Length).Select(n2 => n2.Length).First();
IEnumerable<string> outerQuery = names.Where ( n => n.Length == val );
这个例子来自Joseph和Ben Albahari的C#4.0 in a Nutshell(Chp 8 P331 / 332),我的混淆源于附图,它似乎表明每次外部查询迭代时都会评估子查询名字的元素。
有人可以澄清LINQ在此设置中的工作原理吗?任何帮助将不胜感激!
答案 0 :(得分:1)
对于以下示例,我是否正确地说内部查询是立即执行的?
不,当枚举外部查询时,将对names
中的每个项执行内部查询。如果您只想执行一次,请使用第二个代码示例。
编辑:正如LukeH所指出的,这只适用于Linq to Objects。其他Linq提供程序(Linq to SQL,Entity Framework ...)可能能够自动优化它
答案 1 :(得分:0)
什么是names
?如果它是集合(并且您使用LINQ to Objects),则将为每个外部查询项执行“子查询”。如果它实际上是查询对象,则结果取决于实际的IQueryable.Provider
。例如,对于LINQ to SQL,您将使用标量子查询提供SQL查询。在大多数情况下,子查询实际上只会被执行一次。