linq 查询中使用的 TAKE 关键字是否会导致该 linq 查询的执行在评估时短路,或者是否有任何方法导致短路?
value = (From DataRow In MyDataTable Where DataRow.Item("MyColumn").ToString = "Y" Take 1).Any
两个都。Take 将只获取前 1 条记录,然后 any 将在找到匹配的记录后立即短路(但由于 take 最多只有 1 条记录)。您可以安全地移除 Take 1 并获得相同的性能。
术语短路在这里并不适用,因为它是关于布尔评估的。在此处查看一些示例。它不适用,因为Take
不返回布尔值。
您可能要问的是:Take
如果Any
是下一个方法,是否执行?从逻辑上讲,如果也被执行,Take
则可以跳过,因为在找到第一个匹配项后也会停止。Any
Any
但是,我们只是在看几个连续调用的扩展方法:
value = MyDataTable.AsEnumerable() _
.Where(Function(DateRow) DataRow.Item("MyColumn").ToString = "Y") _
.(Take(1)) _
.Any()
如此Take
运行,然后接下来发生的任何方法,在这种情况下Any
。怎么会Take
知道它不需要运行?如果您从源代码构建自己的扩展方法并添加跟踪语句,则可以轻松证明这一点。
也许一个潜在的问题是,性能方面重要吗?好吧,这是两次迭代(顶部)与一次,试图阻止它将是一个微优化。