c# - Entity Framework 枚举 SqlQuery 结果

标签 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 的结果 View 时,它显示了预期的 result("Some Value") 但在调用最后一行时我有一个异常(exception)

"The SqlParameter is already contained by another SqlParameterCollection.".

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

最佳答案

It looks like when I try to open Result View of result it invokes this query again

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

关于c# - Entity Framework 枚举 SqlQuery 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15761531/

相关文章:

c# - 如何使用 Entity Framework 将静态数据植入数据库?

c# - 单击 MVC3 Razor 中的提交按钮后在标签中显示测试框文本

c# - 是否有必要在 finally block 中处理数据集

c# - Visual Studio 中是否有创建方法的快捷方式?

arrays - 获取数组的每n个元素

python - 为什么遍历枚举比生成器快得多?

c# - 如何从自定义 SQL "AdminUsers"表中为管理员保护 MVC4 区域

c# - 无法将两个 linq 结果合并到一个 var 中

casting - 如何在 "for in"枚举中快速转换元组?

c# - 如何创建初始化程序来创建和迁移 mysql 数据库?