Каждый раз, когда вы получаете доступ к запросу LINQ, он запрашивает базу данных для обновления данных.Чтобы остановить это, используйте .ToArray()
или .ToList().
например,
var result = (from p in _db.Pages
select p).ToList(); //will query now
Write(result); //will not requery
Write(result2); //will not requery
Важно понимать, что необработанный запрос LINQ выполняется, когда он используется, а не когда он записан вкод (например, не утилизируйте ваш _db до этого).
Это может быть удивительно, когда вы понимаете, как это действительно работает.Это позволяет отразить цепочку методов и последующую модификацию запроса в последнем выполнении запроса в БД.Важно всегда помнить, так как это может привести к ошибкам во время выполнения, которые не будут обнаружены во время компиляции, обычно потому, что соединение с БД закрыто до использования списка, так как вы передаете то, что кажется простым IEnumerable.
РЕДАКТИРОВАТЬ: Изменено, чтобы удалить мое мнение и отразить обсуждение в комментариях.Лично я думаю, что компилятор должен предполагать, что конечный результат связанных запросов запускается немедленно, если вы явно не скажете, что он будет дополнительно изменен позже.Просто чтобы избежать ошибок во время выполнения, это неизбежно вызывает.