实体框架枚举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。"

看起来当我尝试打开结果的结果视图时,它再次调用此查询。这种行为是否正确?如果是,请解释原因

实体框架枚举SqlQuery结果

当我尝试打开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>,它包含了您的查询结果。