【问题标题】:Error when trying to iterate through Queryable尝试遍历 Queryable 时出错
【发布时间】: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() 时它不会发生。

到目前为止,我已经四处搜索,但没有找到满意的答案。所以我的问题是:

  1. 除了添加.ToList()之外还有其他方法吗?
  2. 如果我使用.ToList() 作为解决方案,这会在投入生产时导致性能问题吗?因为 AFAIK ToList() 会尝试加载内存中的所有内容。
  3. 我的实体中有很多导航属性,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


【解决方案1】:

除了添加 .ToList() 还有其他方法吗?

我猜你的连接字符串中的enabling MARS 可能是ToList() 的替代品。

如果我使用 .ToList() 作为解决方案,这会在投入生产时导致性能问题吗?

这取决于数据库中不同用户名的数量

因为 AFAIK ToList() 会尝试加载内存中的所有内容。

它只会尝试在内存中加载所有不同的用户名

我的实体中有很多导航属性,ToList() 会尝试加载导航属性中的所有内容吗?

不,它将执行适当的查询并在 UserName 列上进行投影。

恕我直言,monitor generated queries in debug mode 是个好习惯

【讨论】:

    猜你喜欢
    • 2013-09-23
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 2021-03-11
    • 2020-05-09
    • 1970-01-01
    相关资源
    最近更新 更多