19

尝试查看 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 中。”。

看起来当我尝试打开结果的结果视图时,会再次调用此查询。如果这种行为正确?如果是,请解释为什么会发生这种情况。

4

1 回答 1

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是 now List<string>,它包含您的查询结果。

于 2013-04-02T10:26:29.263 回答