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