Объекты, выставленные как IQueryable<T>
и IEnumerable<T>
, фактически не выполняются до тех пор, пока они не будут повторены или иным образом недоступны, например, составлены в List<T>
. Когда EF возвращает IQueryable<T>
, он по существу просто создает что-то, способное извлекать данные, оно фактически не выполняет извлечение, пока вы его не уничтожаете.
Вы можете почувствовать это, поставив точку останова, где IQueryable
определяется, когда вызывается .ToList()
. (Изнутри контекста данных, как правильно указал Jofry.) Работа по извлечению данных выполняется во время вызова ToList()
.
Из-за этого вам нужно сохранить IQueryable<T>
в рамках контекста данных.
Правильный путь состоит в том, чтобы использовать StackTrace
и StackFrame
классы. Выдача исключения только для получения отслеживания стека полностью неправильно использует исключения.
Можно использовать StackTrace
и StrackFrame
классы в System.Diagnostics
.