.NET Entity Framework - IEnumerable VS. IQueryable

Пожалуйста, посмотрите эту строку кода. Это вызов хранимой процедуры, которая возвращает ObjectResult. Чтобы извлечь длинные значения, я добавил Select:

dbContext.FindCoursesWithKeywords(keywords).Select(l => l.Value);

На основании intellisense этот Select возвращает IEnumerable.

Я не уверен, читал ли я это где-то или просто привык к такому предположению - я всегда думал, что когда EF API возвращает IEnumerable (а не IQueryable), это означает, что результаты были материализованы. Это означает, что они были извлечены из базы данных.

Сегодня я обнаружил, что был неправ (или, может быть, это ошибка?). Я продолжал получать ошибку

"Новая транзакция не разрешена, потому что есть другие потоки. в сессии"

По сути, эта ошибка говорит о том, что вы пытаетесь сохранить изменения, в то время как db reader все еще читает записи.

В конце концов я решил эту проблему (что я считал долгой попыткой) и добавил вызов ToArray() для материализации IEnumerable...

Итак, итог - должен ли я ожидать, что результаты IEnumerable от EF будут содержать результаты, которые еще не материализовались? Если да, то есть ли способ узнать, был ли IEnumerable материализован или нет?

Спасибо и извините, если это один из тех вопросов "duhhh"... :)

23
задан Eranga 30 September 2011 в 06:39
поделиться