繁体   English   中英

实体框架枚举SqlQuery结果

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM