说我有IQueryable<Car> cars
。
我对其进行迭代,例如:
foreach (Car c in cars)
{
c.Doors = 2;
}
为什么c.Doors
在foreach之后包含原始值,而不是更改后的值?
先感谢您
说我有IQueryable<Car> cars
。
我对其进行迭代,例如:
foreach (Car c in cars)
{
c.Doors = 2;
}
为什么c.Doors
在foreach之后包含原始值,而不是更改后的值?
先感谢您
您指出 IQueryable 是 linq to entity 查询的结果,这不是正确的语句。MyDatabaseContext.Cars.Where(x => x.Name == "Test") 返回一个 IQueryable,它在迭代时对数据库执行查询。(迭代是当您对其执行 foreach 时)。所以它还不包含结果集,只是查询。
在汽车上循环两次会生成 2 个对数据库相同的查询并返回 2 个相同的结果集。如果要保留数据。您需要调用 ToArray 或 ToList 或在操作之后,在再次迭代之前执行更改的保存。
IQueryable
正如我确定您知道的那样,迭代 an会在执行过程中从数据库中检索结果集。我在这种情况和其他情况下观察到的是,这个结果没有被缓存,所以你经常会发现再次迭代IQueryable
实际上会再次运行查询,因此你的修改不会被保留,因为你得到了一个新的从未受该代码影响的结果集。
当您ToList()
第一次调用并迭代其结果时它起作用的原因是因为ToList()
检索并实现整个结果集,然后不再链接到数据库内容,实际上只是数据库返回的内容的副本。
确保您的更改能够生效的唯一方法是对数据的本地副本进行操作,即将其从IQueryable
土地中取出。这可以像保存一个IEnumerable
结果集(即 的结果ToEnumerable()
)一样简单,然后每次枚举它时都会返回相同的结果集,但不像ToList()
它不会立即引起评估。