【问题标题】:Entity Framework enumerating SqlQuery result实体框架枚举 SqlQuery 结果
【发布时间】:2013-04-02 10:14:33
【问题描述】:

我在尝试查看 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 已经被另一个包含 SqlParameterCollection。”。

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

【问题讨论】:

    标签: c# enumeration entity-framework-4.3


    【解决方案1】:

    看起来当我尝试打开结果视图时它再次调用此查询

    你说的很对——你看到了Deferred Execution的效果

    Database.SqlQuery&lt;T&gt; 返回一个IEnumerable&lt;T&gt;,它实际上是一个类型的对象:

    System.Data.Entity.Internal.InternalSqlQuery<T>
    

    所以您的result 对象实际上只是对查询的描述,而不是查询结果。

    只有当您尝试查看查询结果时,才会在数据库上实际执行 SQL 查询。

    您看到的是这种情况发生了两次:一次是在您的代码调用 .Any() 时,一次是在调试器枚举结果集时。


    您可以通过使用.ToList() 明确告诉 EF 何时运行查询来解决此问题:

    var result = _dbContext.SqlQuery<string>(sql, someParamSqlParameter).ToList();
    

    result 的类型现在是 List&lt;string&gt;,它包含您的查询结果。

    【讨论】:

    • 很好的解释。非常感谢您如此快速而清晰的回答。
    • 好伙伴。我快疯了,同一主题的所有其他答案都没有任何帮助。
    • 我一生都无法弄清楚这个问题是如何产生报告的错误消息的。
    • 说真的...我只花了6个小时...答案是去.ToList()??太棒了!
    猜你喜欢
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多