请看这行代码。这是一个存储过程的调用,它返回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) –