【发布时间】:2015-11-21 14:51:48
【问题描述】:
foreach(var name in _cust.Select(s => s.Username).Distinct())
{
var x = _cust.Select(s => s.Username == name); //ERROR HERE
//rest of the code here
}
会抛出There is already an open DataReader associated with this Command which must be closed first. 异常,但是当我添加.ToList() 时它不会发生。
到目前为止,我已经四处搜索,但没有找到满意的答案。所以我的问题是:
- 除了添加
.ToList()之外还有其他方法吗? - 如果我使用
.ToList()作为解决方案,这会在投入生产时导致性能问题吗?因为 AFAIKToList()会尝试加载内存中的所有内容。 - 我的实体中有很多导航属性,
ToList()会尝试加载导航属性中的所有内容吗?
谢谢
【问题讨论】:
-
什么是 _cust ?当您使用 foreach 时,您为什么还要费心制作
ToList()(所以您无论如何都要枚举所有UserNames ? -
_cust 是
DbSet。没有.ToList(),会抛出异常There is already an open DataReader associated with this Command which must be closed first.见stackoverflow.com/questions/4867602/… -
1.我认为错误发生在_cust 的计算中。在这种情况下,执行时间似乎很重要(toList-> after Execution vs foreach() -> 在这一行) 2. ToList() 将枚举查询,foreach 也是如此。 3.这取决于您的查询,意思是:您的上下文打开了多长时间?你包括什么吗?你使用 AsNoTracking() 吗?
-
“计算_cust”是什么意思?
-
什么是_cust?它背后的查询是什么?如您所知,只有在需要该值时才会执行任何查询,这意味着您必须计算该值,因为您使用的是 ToList()、foreach()、First() 或任何东西。
标签: c# linq entity-framework entity-framework-6 iqueryable