Widziałem wiele projektów z repozytoriami, które zwracają instancje IQueryable
. Pozwala to na dodatkowe filtry, a sortowanie może odbywać się IQueryable
według innego kodu, co przekłada się na generowanie innego kodu SQL. Jestem ciekawy, skąd wziął się ten wzór i czy to dobry pomysł.
Moją największą obawą jest to, że IQueryable
obietnica trafi do bazy danych jakiś czas później, kiedy zostanie wyliczona. Oznacza to, że błąd zostanie wyrzucony poza repozytorium. Może to oznaczać, że wyjątek Entity Framework zostanie zgłoszony w innej warstwie aplikacji.
W przeszłości miałem również problemy z wieloma aktywnymi zestawami wyników (MARS) (szczególnie przy korzystaniu z transakcji) i takie podejście wydaje się, że częściej by się tak działo.
Zawsze wywoływałem AsEnumerable
lub ToArray
na końcu każdego wyrażenia LINQ, aby upewnić się, że baza danych została trafiona przed opuszczeniem kodu repozytorium.
Zastanawiam się, czy zwracanie IQueryable
może być przydatne jako element składowy warstwy danych. Widziałem dość ekstrawagancki kod z jednym repozytorium wywołującym inne repozytorium w celu zbudowania jeszcze większego IQueryable
.
where
klauzulę do odroczonego IQueryable
, wystarczy wysłać te dane przewodowo, a nie cały zestaw wyników.