ObjectResult<long?>
。为了提取这些长整型数值,我添加了Select语句:dbContext.FindCoursesWithKeywords(keywords).Select(l => l.Value);
根据智能感知,此Select返回 IEnumerable<long>
。
我不确定我是否在某个地方读过这个信息,或者可能只是习惯了这个假设 - 我一直认为,当EF API返回一个 IEnumerable
(而不是 IQueryable
)时,结果已经被材料化。这意味着它们已经从数据库中提取出来了。
今天我发现我错了(或者可能是个bug?)。我一直收到错误:
"New transaction is not allowed because there are other threads running in the session"
基本上,这个错误告诉你,在db reader仍在读取记录时,你正在尝试保存更改。
最终我通过(我认为是冒险行为),并添加了 ToArray()
调用来材料化 IEnumerable<long>
...
所以 - 底线是 - 我应该期望从EF获得的 IEnumerable
结果包含尚未材料化的结果吗?如果是,那么有没有一种方法可以知道是否已经材料化了 IEnumerable
?
谢谢,如果这是一个“duhhh”问题,那我很抱歉... :)
IEnumerable<T>
和一个IQueryable<T>
一样都被普遍认为使用延迟执行,因此都没有被“实现”。 - Damien_The_Unbeliever