c# - Entity Framework enumerando el resultado de SqlQuery
enumeration entity-framework-4.3 (1)
Tengo un error extraño al intentar ver los resultados de SqlQuery:
var sql = "SELECT @someParam";
var someParamSqlParameter = new SqlParameter("someParam", "Some Value");
var result = _dbContext.SqlQuery<string>(sql, someParamSqlParameter);
var containsAnyElements = result.Any();
Entonces, cuando el depurador está en la última línea y cuando intento expandir la Vista de resultados del resultado, se muestra el result("Some Value")
esperado result("Some Value")
pero al invocar la última línea obtuve una excepción
"El SqlParameter ya está contenido en otro SqlParameterCollection".
Parece que cuando intento abrir la Vista de resultados del resultado, vuelve a invocar esta consulta. Si ese comportamiento es correcto? Si es así, por favor explique por qué sucede eso.
Parece que cuando intento abrir la Vista de resultados del resultado, vuelve a invocar esta consulta
Tienes toda la razón, estás viendo los efectos de la Deferred Execution
Database.SqlQuery<T>
devuelve un IEnumerable<T>
que en realidad es un objeto de tipo:
System.Data.Entity.Internal.InternalSqlQuery<T>
Por lo tanto, su objeto de result
es en realidad solo una descripción de la consulta, no los resultados de la consulta.
La consulta SQL solo se ejecuta realmente en la base de datos cuando intenta ver los resultados de la consulta.
Lo que está viendo es que esto sucede dos veces: una vez que su código llama .Any()
, y una vez cuando el depurador enumera el conjunto de resultados.
Puede solucionar esto indicando explícitamente a EF cuándo ejecutar la consulta con .ToList()
:
var result = _dbContext.SqlQuery<string>(sql, someParamSqlParameter).ToList();
El tipo de result
ahora es List<string>
y contiene los resultados de su consulta.