延迟执行值不变

时间:2012-02-21 13:13:03

标签: c# entity-framework deferred-execution

说我有IQueryable<Car> cars

我迭代它,如:

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

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

提前谢谢

2 个答案:

答案 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()它不会立即引起评估。