[英]Entity Framework enumerating SqlQuery result
我在尝试查看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中。”
它看起来就像当我尝试打开结果视图的结果再次调用此查询。 如果那种行为正确吗? 如果是,请解释为什么会发生这种情况。
看起来当我尝试打开结果的结果视图时,它再次调用此查询
你是对的 - 你看到了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>
,它包含查询结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.