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