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