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
,它包含查询结果。