Vedere questa riga di codice. Questa è un'invocazione di una stored procedure, che restituisce un ObjectResult<long?>
. Al fine di estrarre i valori lunghi ho aggiunto il Select:.NET Entity Framework - IEnumerable VS. IQueryable
dbContext.FindCoursesWithKeywords(keywords).Select(l => l.Value);
Sulla base di questo intellisense SELECT restituisce IEnumerable<long>
.
Non sono sicuro se l'ho letto da qualche parte o forse mi sono abituato a questa ipotesi - ho sempre pensato che quando l'API EF restituisce un IEnumerable
(e non IQueryable
) significa che i risultati sono stati materializzati. Significa che sono stati estratti dal database.
Ho scoperto oggi che ho sbagliato (o forse è un bug?). Ho continuato a ottenere l'errore
"nuova transazione non è consentito, perché ci sono altri thread esecuzione nella sessione"
In sostanza, questo errore si dice che si sta cercando di salvare le modifiche, mentre la lettore db sta ancora leggendo i record.
Alla fine ho risolto da (quello che ho considerato un colpo lungo) e ha aggiunto ToArray()
chiamata a materializzarsi il ...
Così IEnumerable<long>
- la linea di fondo - devo aspettarmi IEnumerable
risultati da EF per contenere i risultati che porto si è ancora materializzato? Se sì, c'è un modo per sapere se uno IEnumerable
è stato materializzato o no?
Grazie e scusa se questa è una di quelle domande 'duhhh' ... :)
non sono sicuro se c'è qualcosa specificamente documentata per EF, ma per Linq in generale, un '' IEnumerable non è altro "materializzato" che un '' IQueryable - entrambi sono generalmente accettato da usare esecuzione differita. –
@Damien_The_Unbeliever: Tuttavia, penso che ObjectResult verrà sempre eseguito quando viene chiamata la funzione ... (in questo caso FindCoursesWithKeywords) –