实体框架枚举SqlQuery结果
本文关键字:结果 SqlQuery 枚举 框架 实体 | 更新日期: 2023-09-27 18:07:06
当我试图查看SqlQuery的结果时,我有奇怪的错误:
var sql = "SELECT @someParam";
var someParamSqlParameter = new SqlParameter("someParam", "Some Value");
var result = _dbContext.SqlQuery<string>(sql, someParamSqlParameter);
var containsAnyElements = result.Any();
所以当调试器在最后一行时,当我试图展开result的结果视图时,它显示了我预期的result("Some Value")
,但在调用最后一行时,我得到了一个异常
" SqlParameter已经包含在另一个SqlParameter中SqlParameterCollection。"
看起来当我尝试打开结果的结果视图时,它再次调用此查询。这种行为是否正确?如果是,请解释原因
当我尝试打开Result的Result View时它会再次调用这个查询
你说得很对——你看到的是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>
,它包含了您的查询结果。