簡體   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