延迟执行值未更改

本文关键字:执行 延迟 | 更新日期: 2023-09-27 18:25:22

假设我有IQueryable<Car> cars

我迭代它,例如:

foreach (Car c in cars)
{
    c.Doors = 2;
}

为什么c.Doors在foreach之后包含原始值,而不是更改后的值?

提前感谢

延迟执行值未更改

您指出IQueryable是linq-to-entities查询的结果,该查询不是正确的语句。MyDatabaseContext.Cars.Where(x=>x.Name=="Test")返回一个IQueryable,它在迭代时对数据库执行查询。(迭代是指对其执行foreach)。所以它还不包含结果集,只包含查询。

在cars上循环两次生成两个对数据库相同的查询,并返回两个相同的结果集。如果要保留数据。您需要调用ToArray或ToList,或者在操作之后,在再次迭代之前执行更改的保存。

IQueryable上迭代时会从数据库中检索结果集,我相信您已经知道了。我在这种情况和其他情况下观察到的是,这个结果没有被缓存,所以你经常会发现,再次迭代IQueryable实际上会再次运行查询,因此你的修改不会被保留,因为你得到的是一个从未受到该代码影响的新结果集。

当您首先调用ToList()并迭代其结果时,它之所以有效,是因为ToList()检索并实现了整个结果集,然后它不再链接到数据库内容,实际上只是数据库返回内容的副本。

确保更改保持不变的唯一方法是对数据的本地副本进行操作,即将其从IQueryable土地上取出。这可以简单到保存结果集的IEnumerable(即ToEnumerable()的结果),然后每次枚举时都会返回相同的结果集,但与ToList()不同,它不会立即引起求值。