实体框架枚举SqlQuery结果

时间:2013-04-02 10:14:34

标签: 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();

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

  

“SqlParameter已被另一个包含   SqlParameterCollection。“

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

1 个答案:

答案 0 :(得分:35)

  

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

你说得对 - 你看到了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>,它包含您的查询结果。