我在尝试查看SqlQuery的结果时遇到奇怪的错误:
var sql = "SELECT @someParam";
var someParamSqlParameter = new SqlParameter("someParam", "Some Value");
var result = _dbContext.SqlQuery<string>(sql, someParamSqlParameter);
var containsAnyElements = result.Any();
因此,当调试器位于最后一行时,当我尝试展开结果的结果视图时,它会显示我预期result("Some Value")
但是在调用最后一行时我得到了一个异常
“SqlParameter已被另一个包含 SqlParameterCollection。“
当我尝试打开结果的结果视图时,它会再次调用此查询。如果那种行为正确吗?如果是,请解释为什么会发生这种情况。
答案 0 :(得分:35)
当我尝试打开结果的结果视图时,它会再次调用此查询
你说得对 - 你看到了Deferred Execution
Database.SqlQuery<T>
返回一个IEnumerable<T>
,它实际上是一个类型为
System.Data.Entity.Internal.InternalSqlQuery<T>
所以你的result
对象实际上只是对查询的描述 - 而不是查询结果。
当您尝试查看查询结果时,SQL查询实际上只在数据库上执行。
您所看到的情况发生了两次:一次是您的代码调用.Any()
,一次是调试器枚举结果集。
您可以通过明确告知EF何时使用.ToList()
运行查询来解决此问题:
var result = _dbContext.SqlQuery<string>(sql, someParamSqlParameter).ToList();
result
的类型现在是List<string>
,它包含您的查询结果。