Proszę zobaczyć ten wiersz kodu. Jest to wywołanie procedury składowanej, która zwraca wartość ObjectResult<long?>
. W celu wydobycia długie wartości dodałem Wybierz:.NET Entity Framework - IEnumerable VS. IQueryable
dbContext.FindCoursesWithKeywords(keywords).Select(l => l.Value);
podstawie intellisense Wybierz ten zwraca IEnumerable<long>
.
Nie jestem pewien, czy go gdzieś przeczytałem, czy po prostu przywykłem do tego założenia - zawsze uważałem, że kiedy EF API zwraca wartość IEnumerable
(a nie IQueryable
), oznacza to, że wyniki zostały zmaterializowane. To znaczy, że zostały wyciągnięte z bazy danych.
Dowiedziałem się dzisiaj, że się myliłem (a może to błąd?). Ciągle otrzymuję błąd
„Nowa transakcja nie jest dozwolone, ponieważ istnieją inne wątki uruchomione w sesji”
Zasadniczo, ten błąd mówi ci, że jesteś stara, aby zapisać zmiany, podczas gdy Czytnik db wciąż czyta rekordy.
Ostatecznie rozwiązano go (co uważałem za długi strzał) i dodano ToArray()
wezwanie do urzeczywistnienia IEnumerable<long>
...
SO - dolnej linii - należy się spodziewać IEnumerable
wyniki EF zawierać wynika, że Haven zmaterializował się jeszcze? Jeśli tak, czy istnieje sposób, aby się dowiedzieć, czy zmaterializował się IEnumerable
?
Dzięki i przepraszam, jeśli jest to jeden z tych „duhhh” pytania ... :)
Nie jestem pewien, czy jest coś specjalnie udokumentowanego dla EF, ale dla Linq ogólnie rzecz biorąc, 'IEnumerable' nie jest już "zmaterializowany" niż 'IQueryable ' - oba są zwykle przyjmowane do odroczonego wykonania. –
@Damien_The_Unbeliever: Jednak myślę, ObjectResult będzie zawsze wykonać, gdy funkcja jest wywoływana ... (w tym przypadku FindCoursesWithKeywords) –