0

说我有IQueryable<Car> cars

我对其进行迭代,例如:

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

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

先感谢您

4

2 回答 2

1

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

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

于 2012-02-21T13:24:02.637 回答
1

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

当您ToList()第一次调用并迭代其结果时它起作用的原因是因为ToList()检索并实现整个结果集,然后不再链接到数据库内容,实际上只是数据库返回的内容的副本。

确保您的更改能够生效的唯一方法是对数据的本地副本进行操作,即将其从IQueryable土地中取出。这可以像保存一个IEnumerable结果集(即 的结果ToEnumerable())一样简单,然后每次枚举它时都会返回相同的结果集,但不像ToList()它不会立即引起评估。

于 2012-02-21T13:29:18.113 回答