Vla*_*irs 18 c# enumeration entity-framework-4.3
我在尝试查看SqlQuery的结果时遇到奇怪的错误:
var sql = "SELECT @someParam";
var someParamSqlParameter = new SqlParameter("someParam", "Some Value");
var result = _dbContext.SqlQuery<string>(sql, someParamSqlParameter);
var containsAnyElements = result.Any();
Run Code Online (Sandbox Code Playgroud)
所以,当调试器是在最后一行,当我尝试展开结果查看结果就说明我的期望result("Some Value"),但在调用最后一行我得到了一个异常
"SqlParameter已经包含在另一个SqlParameterCollection中."
它看起来就像当我尝试打开结果视图的结果再次调用此查询.如果那种行为正确吗?如果是,请解释为什么会发生这种情况.
Nic*_*ler 35
看起来当我尝试打开结果的结果视图时,它再次调用此查询
你是对的 - 你看到的效果 Deferred Execution
Database.SqlQuery<T>返回一个IEnumerable<T>实际上是类型的对象:
System.Data.Entity.Internal.InternalSqlQuery<T>
Run Code Online (Sandbox Code Playgroud)
所以你的result对象实际上只是对查询的描述 - 而不是查询结果.
当您尝试查看查询结果时,SQL查询仅在数据库上实际执行.
您所看到的是这种情况发生了两次:一次是在您的代码调用时.Any(),一次是在调试器枚举结果集时.
您可以通过显式告知EF何时运行查询来解决此问题.ToList():
var result = _dbContext.SqlQuery<string>(sql, someParamSqlParameter).ToList();
Run Code Online (Sandbox Code Playgroud)
类型result现在是List<string>,它包含您的查询结果.