請看這行代碼。這是一個存儲過程的調用,它返回ObjectResult<long?>
。爲了提取長值,我增加了選擇:.NET實體框架 - IEnumerable VS. IQueryable
dbContext.FindCoursesWithKeywords(keywords).Select(l => l.Value);
基於智能感知這個選擇返回IEnumerable<long>
。
我不知道我是在某處閱讀,還是習慣了這個假設 - 我一直認爲當EF API返回IEnumerable
(而不是)時,這意味着結果已經實現。意思是他們已經從數據庫中提取出來了。
我今天發現我錯了(或者這可能是一個錯誤?)。我一直得到錯誤
「新的事物是不允許的,因爲有其他線程 在會話中運行」
基本上,這個錯誤告訴你,你想救而變化數據庫讀取器仍在讀取記錄。
最後我解決它的(我認爲是一個長鏡頭),並加入ToArray()
呼叫物化爲IEnumerable<long>
...
所以 - 底線 - 我應該期待EF IEnumerable
結果包含結果避風港物化了嗎?如果是,那麼有沒有辦法知道IEnumerable
是否已經實現?
感謝,如果是這樣的那些「duhhh」的問題之一道歉... :)
我不確定是否有任何特別記錄的EF,但是對於Linq來說,'IEnumerable'不比'IQueryable '更具體化 - 兩者通常都假定使用延遲執行。 –
@Damien_The_Unbeliever:但是,我認爲ObjectResult將始終執行時調用該函數...(在這種情況下FindCoursesWithKeywords) –