entity framework枚举SqlQuery结果

我在尝试查看SqlQuery的结果时遇到奇怪的错误:

var sql = "SELECT @someParam"; var someParamSqlParameter = new SqlParameter("someParam", "Some Value"); var result = _dbContext.SqlQuery(sql, someParamSqlParameter); var containsAnyElements = result.Any(); 

所以当调试器在最后一行时,当我尝试展开结果的结果视图时,它会显示我预期的result("Some Value")但是在调用最后一行时我得到了一个exception

“SqlParameter已经包含在另一个SqlParameterCollection中。”

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

看起来当我尝试打开结果的结果视图时,它再次调用此查询

你说得对 – 你看到了Deferred Execution的影响

Database.SqlQuery返回一个IEnumerable ,它实际上是一个类型的对象:

 System.Data.Entity.Internal.InternalSqlQuery 

所以你的result对象实际上只是对查询的描述 – 而不是查询结果。

当您尝试查看查询结果时,SQL查询仅在数据库上实际执行。

您所看到的是这种情况发生了两次:一次是您的代码调用.Any() ,一次是调试器枚举结果集。


您可以通过显式告知EF何时使用.ToList()运行查询来解决此问题:

 var result = _dbContext.SqlQuery(sql, someParamSqlParameter).ToList(); 

result类型现在是List ,它包含查询结果。