我试图查看 SqlQuery 的结果时出现奇怪的错误:
var sql = "SELECT @someParam";
var someParamSqlParameter = new SqlParameter("someParam", "Some Value");
var result = _dbContext.SqlQuery<string>(sql, someParamSqlParameter);
var containsAnyElements = result.Any();
因此,当调试器位于最后一行时,当我尝试扩展 result 的结果 View 时,它显示了预期的 result("Some Value")
但在调用最后一行时我有一个异常(exception)
"The SqlParameter is already contained by another SqlParameterCollection.".
看起来当我尝试打开 result 的结果 View 时,它会再次调用此查询。如果这种行为正确?如果是,请解释为什么会这样。
最佳答案
It looks like when I try to open Result View of result it invokes this query again
你说得对 - 你看到了 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>
它包含您的查询结果。
关于c# - Entity Framework 枚举 SqlQuery 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15761531/