2

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

我在 MSDN 上阅读了关于 LINQ 查询的内容:

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

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

4

1 回答 1

2

确实,没有。实际上,这并不完全正确 - 一些 LINQ 提供程序会发现一些琐碎但常见的示例,例如:

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

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

请注意,重新执行也与数据是否发生变化无关;无论如何它都会重新执行(或不执行)。

这里有两条外卖信息:

  • 不要多次迭代任何可枚举:尤其是,它根本不能保证工作
  • 如果要缓冲数据,请将其放入列表/数组中

所以:

var list = someQuery.ToList();

无论您迭代多少次,都不会重新执行查询list。因为list不是查询:它是一个列表

第三个要点是:

  • 如果您有一个足够长的上下文,以至于询问有关数据迁移的问题很有趣,那么您可能将您的数据上下文保存的时间太长了——它们的寿命很短
于 2013-07-11T08:46:59.810 回答