如果没有发生变化,linq查询会重新执行吗?

时间:2013-07-11 08:42:10

标签: c# linq

我正在阅读LINQ。我知道有延迟和即时查询。我知道在枚举时运行查询的延迟类型允许对数据集的任何更改反映在每个枚举中。但是,如果在上次枚举后数据集没有发生任何变化的情况下有一种机制可以防止查询运行,我似乎无法找到答案。

我在MSDN上阅读了LINQ查询:

  

因此,如果查询被枚举两次,它将被执行两次。

我忽略了一个明显的 - 但是......?

1 个答案:

答案 0 :(得分:2)

确实,没有。实际上,这不是相当是真的 - 一些LINQ提供商会发现琐碎但常见的例子,如:

int id = ...
var customer = ctx.Customers.SingleOrDefault(x => x.Id == id);

并将通过身份管理器拦截它,即它将检查它是否已在上下文中具有匹配的记录;如果是的话:它不会执行任何操作。

您应该注意,重新执行也与数据是否发生变化无关;它将重新执行(或不重新),无论

这里有两条外卖消息:

  • 不要多次迭代任何可枚举:至少,不能保证完全可以工作
  • 如果要缓冲数据,将其放入列表/数组

所以:

var list = someQuery.ToList();
无论您迭代list多少次,

都不会重新执行查询。由于list不是查询:它是列表

第三个外卖将是:

  • 如果您的上下文足够长,以至于感兴趣询问数据迁移,那么您可能正在为远远保留数据上下文很久 - 他们的目的是短暂的
相关问题