调用另一个存储库时出错 - '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",例如通过获取附加数据 同时获取外部列表 (例如,单个查询的多个结果网格)
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",例如通过获取附加数据 同时获取外部列表 (例如,单个查询的多个结果网格)