Consulte esta línea de código. Esta es una invocación de un procedimiento almacenado, que devuelve un ObjectResult<long?>
. Con el fin de extraer los valores largos añadí el Select:.NET Entity Framework - IEnumerable VS. IQueryable
dbContext.FindCoursesWithKeywords(keywords).Select(l => l.Value);
Basado en intellisense esta SELECT devuelve IEnumerable<long>
.
No estoy seguro de si lo leí en algún lado o tal vez me acostumbre a esta suposición: siempre pensé que cuando la API de EF devuelve IEnumerable
(y no IQueryable
) significa que los resultados se han materializado. Lo que significa que han sido sacados de la base de datos.
Descubrí hoy que estaba equivocado (¿o quizás es un error?). Seguí recibiendo el error
"Nueva transacción no está permitido porque hay otros hilos que se ejecutan en la sesión"
Básicamente, este error le indica que usted está tratando de guardar los cambios mientras que el db reader todavía está leyendo registros.
el tiempo me lo resolvió por (lo que consideraba una posibilidad muy remota) y se añadió ToArray()
llamada a materializar la ...
Así IEnumerable<long>
- la línea de fondo - debo esperar IEnumerable
resultados de EF para contener los resultados de ese refugio ¿Ya se materializó? En caso afirmativo, ¿hay alguna manera de saber si se ha materializado o no un IEnumerable
?
Gracias y disculpas si esta es una de esas preguntas 'duhhh' ... :)
No estoy seguro si hay algo documentado específicamente para EF, pero para Linq en general, un 'IEnumerable' no es más "materializado" que un 'IQueryable ' - generalmente se supone que ambos usan ejecución diferida. –
@Damien_The_Unbeliever: Sin embargo, creo que ObjectResult siempre se ejecutará cuando se llame a la función ... (en este caso FindCoursesWithKeywords) –