2013-04-02 120 views
17

我,而我試圖查看SqlQuery類的結果奇怪的錯誤:實體框架枚舉類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載。」

它看起來就像當我嘗試打開的結果再次調用此查詢結果視圖。如果這種行爲正確?如果是,請解釋爲什麼會發生。

回答

35

它看起來就像當我嘗試打開結果的結果視圖再次調用此查詢

你說得對 - 你看到的Deferred Execution

Database.SqlQuery<T>返回的影響IEnumerable<T>這實際上是一個類型的對象:

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

所以你result對象實際上只是查詢的描述 - 而不是查詢結果。

當您嘗試查看查詢結果時,SQL查詢僅實際在數據庫上執行。

你所看到的是這種情況會發生兩次:一次是你的代碼調用.Any(),一次調試器枚舉結果集。


您可以通過當與.ToList()運行查詢明確地告訴EF解決這個問題:

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

類型的result現在是List<string>,它包含您的查詢的結果。

+0

很好的解釋。非常感謝你如此快速和明確的答案。 – Vladimirs

+0

偉大的伴侶。我瘋了,所有其他同一主題的答案都沒有任何幫助。 – alessalessio

+2

我不能爲我的生活弄清楚這個問題是如何產生報告的錯誤信息的。 –