延迟执行值未更改
本文关键字:执行 延迟 | 更新日期: 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()
不同,它不会立即引起求值。