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