Отложенное значение выполнения без изменений - PullRequest
0 голосов
/ 21 февраля 2012

Скажите, что у меня есть IQueryable<Car> cars.

Я повторяю это, например:

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

Почему c.Doors содержит исходное значение после foreach вместо измененного значения?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 21 февраля 2012

Итерация по IQueryable извлекает набор результатов из базы данных, как я знаю, вы знаете.В этой и других ситуациях я наблюдал, что этот результат не кэшируется, поэтому вы часто обнаруживаете, что повторение по IQueryable фактически снова запускает запрос, поэтому ваши изменения не сохраняются, потому что выполучение нового набора результатов, который никогда не затрагивался этим кодом.

Причина, по которой он работает, когда вы сначала вызываете ToList() и выполняете итерацию по результату, заключается в том, что ToList() получает и материализует весь набор результатов,который больше не связан с содержимым базы данных и на самом деле является просто копией того, что возвращала база данных.

Единственный способ убедиться, что ваши изменения останутся неизменными, - это работать с локальной копией данных, т.е.поднять его из IQueryable земли.Это может быть так же просто, как сохранение IEnumerable набора результатов (т. Е. Результата ToEnumerable()), который будет возвращать один и тот же набор результатов каждый раз, когда вы его перечисляете, но в отличие от ToList() это не приведет к оценкенемедленно.

1 голос
/ 21 февраля 2012

Вы указали, что IQueryable является результатом запроса linq to entity, который не является корректным оператором.MyDatabaseContext.Cars.Where (x => x.Name == "Test") возвращает IQueryable, который на итерации выполняет запрос к базе данных.(Итерация - это когда вы выполняете foreach над ним).Таким образом, он пока не содержит результирующий набор, только запрос.

, повторяющийся дважды на автомобилях, генерирует 2 идентичных запроса к базе данных и возвращает 2 идентичных набора результатов.Если вы хотите сохранить данные.вам нужно вызвать ToArray или ToList или после манипуляции выполнить сохранение изменений перед повторной итерацией.

...