调用另一个存储库时出错 - 'There is already an open DataReader associated with this Command which must be closed first'

Error when calling another repo - 'There is already an open DataReader associated with this Command which must be closed first'

 public IQueryable<Application> GetAppById(Guid Id)                     
 {
        return Repository.Query().Where(c => c.Id == Id).Select(c => c.App)
 }

我在上面得到了这段代码,但它似乎 return 不对。如果我调用数据库中的另一个存储库,例如 Repository2.Query().Where(??code??)。我收到以下错误。

错误: {"There is already an open DataReader associated with this Command which must be closed first."}


但是,当我将 return 更改为 ICollection<> 时,它会正确响应。

 public ICollection<Application> GetAppById(Guid Id)                     
 {
        return Repository.Query().Where(c => c.Id == Id).Select(c => c.App).ToList();
 }

我调试 IQueryable return,没有错误,但我找不到它检索的数据。当您调用另一个存储库时会发生错误。

消息正确;您允许两个命令同时执行。第一个方法显示 returns a "query" - 它实际上不会执行 任何东西 直到你迭代它 - 直到你 stop 迭代它。事实上, IQueryable<T> 的全部目的是允许在执行之前进行额外的组合。因此,假设您使用的是 foreach,查询在 foreach 期间处于活动状态, 而不是 调用 GetAppById 本身。所以如果你做经典的 "N+1":

foreach(var row in SomeOuterQuery(...)) { // N+1, not a great idea
    SomeInnerQuery(row, ...);
}

那你绝对是在运行同时执行多个命令。

主要修复了三个问题:

  • 运行 第一个查询 完整 ,然后迭代 结果 - 这就是添加 ToList 确实:它将 foreach 移动到 内部 GetAppById
  • 启用"MARS"(多个活动结果集)-注意:这不是建议,只是一个"this will work"(但是:并非所有有效的方法都是好主意)
  • 重组工作以不再需要 "N+1" 中的 "N",例如通过获取附加数据 同时获取外部列表 (例如,单个查询的多个结果网格)