我第一次使用 .NET 中的实体框架,并且一直在编写 LINQ 查询以从我的模型中获取信息。我想从一开始就养成良好的编程习惯,所以我一直在研究编写这些查询的最佳方法,并得到它们的结果。不幸的是,在浏览 Stack Exchange 时,我似乎遇到了关于延迟/立即执行如何与 LINQ 一起工作的两个相互矛盾的解释:
- foreach 导致在循环的每次迭代中执行查询:
LINQ 查询上的慢 foreach()问题演示- ToList() 极大地提高了性能 - 为什么会这样?,这意味着需要调用“ToList()”才能立即评估查询,因为 foreach 正在重复评估数据源上的查询,从而大大减慢了操作速度。
另一个例子是通过分组 linq 结果进行搜索的问题非常慢,有什么提示吗?,其中接受的答案还意味着在查询上调用“ToList()”将提高性能。
- foreach 使查询执行一次,并且可以安全地与 LINQ 一起使用
有问题演示foreach 是否只执行一次查询?, 言下之意是foreach导致一个枚举建立,不会每次都查询数据源。
继续浏览该站点发现了许多问题,其中“在 foreach 循环期间重复执行”是性能问题的罪魁祸首,还有许多其他答案表明 foreach 将适当地从数据源中获取单个查询,这意味着两者解释似乎有道理。如果“ToList()”假设不正确(截至 2013 年 6 月 5 日下午 1:51 EST 的大多数当前答案似乎暗示),这种误解来自哪里?这些解释中是否有一种准确而另一种不准确,或者是否存在可能导致 LINQ 查询以不同方式评估的不同情况?
编辑:除了下面接受的答案之外,我在 Programmers 上提出了以下问题,这非常有助于我理解查询执行,特别是在循环期间可能导致多个数据源命中的陷阱,我认为这会对其他对此问题感兴趣的人有所帮助:https ://softwareengineering.stackexchange.com/questions/178218/for-vs-foreach-vs-linq