Пожалуйста, посмотрите эту строку кода. Это вызов хранимой процедуры, которая возвращает ObjectResult
. Чтобы извлечь длинные значения, я добавил Select:
dbContext.FindCoursesWithKeywords(keywords).Select(l => l.Value);
На основании intellisense этот Select возвращает IEnumerable
.
Я не уверен, читал ли я это где-то или просто привык к такому предположению - я всегда думал, что когда EF API возвращает IEnumerable
(а не IQueryable
), это означает, что результаты были материализованы. Это означает, что они были извлечены из базы данных.
Сегодня я обнаружил, что был неправ (или, может быть, это ошибка?). Я продолжал получать ошибку
"Новая транзакция не разрешена, потому что есть другие потоки. в сессии"
По сути, эта ошибка говорит о том, что вы пытаетесь сохранить изменения, в то время как db reader все еще читает записи.
В конце концов я решил эту проблему (что я считал долгой попыткой) и добавил вызов ToArray()
для материализации IEnumerable
...
Итак, итог - должен ли я ожидать, что результаты IEnumerable
от EF будут содержать результаты, которые еще не материализовались? Если да, то есть ли способ узнать, был ли IEnumerable
материализован или нет?
Спасибо и извините, если это один из тех вопросов "duhhh"... :)