2013-04-02 6 views
17

ho strano errore, mentre io sto cercando di visualizzare i risultati di sqlquery:Entity Framework enumerazione sqlquery risultato

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

Così, quando debugger è finalmente online e quando cerco di ampliare Visualizza i risultati di risultato mostra mi aspettavo result("Some Value") ma su come richiamare ultima riga mi sono un'eccezione

"La SqlParameter è già contenuta da un altro SqlParameterCollection.".

Sembra che quando provo ad aprire Risultato Vista risultato invoca di nuovo questa query. Se quel comportamento è corretto? Se sì, per favore spiega perché succede.

risposta

35

Sembra che quando provo ad aprire Risultato Vista del risultato invoca di nuovo questa query

Hai ragione - si sta vedendo gli effetti di Deferred Execution

Database.SqlQuery<T> restituisce un IEnumerable<T> che in realtà è un oggetto di tipo:

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

Così il vostro result l'oggetto è in realtà solo una descrizione della query, non i risultati della query.

La query SQL viene effettivamente eseguita sul database solo quando si tenta di visualizzare i risultati della query.

Quello che stai vedendo è che accade due volte: una volta quando il tuo codice chiama .Any() e una volta quando il debugger enumera il set di risultati.


È possibile risolvere questo problema dicendo esplicitamente EF quando eseguire la query con .ToList():

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

Il tipo di result è ora List<string> e contiene i risultati della query.

+0

Grande spiegazione. Grazie mille per la risposta così veloce e chiara. – Vladimirs

+0

Grande amico. Stavo diventando pazzo, e tutte le altre risposte con lo stesso argomento non erano di alcun aiuto. – alessalessio

+2

Non riesco a capire come questo problema abbia prodotto il messaggio di errore riportato. –