2013-04-02 4 views
17

Ich habe seltsame Fehler, während ich versuche, Ergebnisse von sqlquery anzuzeigen:Entity Framework Aufzählen sqlquery Ergebnis

var sql = "SELECT @someParam"; 
var someParamSqlParameter = new SqlParameter("someParam", "Some Value"); 
var result = _dbContext.SqlQuery<string>(sql, someParamSqlParameter); 
var containsAnyElements = result.Any(); 

Also, wenn Debugger letzte Zeile ist und wenn ich versuche Ergebnisse Ansicht von Ergebnis zu erweitern es zeigt ich erwartete result("Some Value") aber auf letzte Zeile Aufruf bekam ich eine Ausnahme

„Die SqlParameter bereits von einer anderen SqlParameterCollection enthalten sind.“.

Es sieht aus wie wenn ich versuche Ergebnis Ansicht von Ergebnis wieder zu öffnen diese Abfrage aufruft. Wenn dieses Verhalten korrekt ist? Wenn ja, bitte erklären Sie, warum das passiert.

Antwort

35

Es sieht aus wie wenn ich versuche Ergebnis Ansicht von Ergebnis zu öffnen diese Abfrage ruft erneut

Sie haben ganz recht - Sie sehen die Auswirkungen von Deferred Execution

Database.SqlQuery<T> ein zurück IEnumerable<T>, die tatsächlich ein Objekt vom Typ ist:

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

So Ihre result Objekt ist eigentlich nur eine Beschreibung der Abfrage - nicht die Abfrageergebnisse.

Die SQL-Abfrage wird nur tatsächlich auf der Datenbank ausgeführt, wenn Sie versuchen, die Ergebnisse der Abfrage anzuzeigen.

Was Sie sehen, ist das passiert zweimal: einmal, wenn Ihr Code .Any() aufruft, und einmal, wenn der Debugger die Ergebnismenge aufzählt.


Sie können dieses Problem beheben, indem Sie explizit EF sagen, wann die Abfrage mit .ToList() auszuführen:

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

Die Art der result jetzt List<string> ist und es enthält die Ergebnisse der Abfrage.

+0

Große Erklärung. Vielen Dank für die schnelle und klare Antwort. – Vladimirs

+0

Toller Kumpel. Ich wurde verrückt, und all die anderen Antworten mit demselben Thema halfen mir nicht weiter. – alessalessio

+2

Ich kann nicht für das Leben von mir herausfinden, wie dieses Problem die Fehlermeldung ausgab, die gemeldet wurde. –