[LINQ] Zawężanie zapytań

0

Hej!

Jeśli mam metodę

        private IQueryable<Termin> LQPodajWszystkieTerminy() // zwraca wszystkie terminy
         {
             var terminy = from t in _db.Termin
                     select t;

             return terminy;
         }

oraz:

         private IQueryable<Termin> LQPodajTylkoDostepneTerminy(IQueryable<Termin> termin) // zwraca terminy > 1
         {
             return termin.Where(x => x.idTerminu > 1);
         }

oraz

       private IQueryable<Termin> LQSotruj(IQueryable<Termin> termin) // sortuje 
         {
             return termin.OrderBy(x => x.data);
         }

Oraz trzecią metodę złączającą powyższe 3

 public Termin[] PodajWszystkieDostepneTerminy()
        {
            var terminy = LQPodajWszystkieTerminy();

            terminy = LQPodajTylkoDostepneTerminy(terminy); // tylko dostępne
            terminy = LQSotruj(terminy);              // sortuję

            Termin[] r = terminy.ToArray<Termin>();

            return r;
        }

To zapytanie do bazy nastąpi tylko raz? Dokładnie w: terminy.ToArray<Termin>();?

Czy jest to poprawny sposób na "rozbijanie" na metody i "zawężanie" zapytań w LinQ ?

pozdrawiam

0

Moim zdaniem takie rozbijanie to trochę niepotrzebna komplikacja, ale jeśli chodzi o wydajność to nie ulegnie ona zmianie: LINQ jest leniwe, tj. najpierw buduje zapytanie, a wykonuje je dopiero, gdy wynik jest już nieodwołalnie potrzebny.
Wykonanie zapytania inicjuje foreach, .ToArray(), .Count() /żeby coś policzyć trzeba to mieć/ ale Select(), Where() i OrderBy() tylko "dopisują" się do treści zapytania.
Zwracanie zapytania jako wyniku funkcji nie powoduje żadnych operacji, tak jak zwracanie inta też nie ma skutków ubocznych.

0

Ja bym prosto odpowiedział ze nie.

W tym przypadku który podałeś to rozbicie nie daje nic poza zmniejszeniem czytelności kodu. Lepiej napisać to w jednej metodzie.

Pozdrawiam.

0

ale istota pytania bylo czy zostanie wykonane jedno zapytanie do bazy
i odpowiedz jest tak, jak napisal Azarien

jestem w stanie wyobrazic sobie bardziej skomplikowane filtorwanie, gdzie takie zabiegi moga jednak wprowadzic wieksza czytelnosc, szczegolnie jesli dany warunek jest zalezny od jakiegos parametru, wartosci i przed kazdym where trzeba dodac if
lub jesli mniejsze metody zwracaja czesto uzywane pozapytania, ktore pozniej moga byc join'owane z kolejnymi podazpytaniami tworzacymi wieksza calosc

0

Dziękuję Wam za odpowiedzi :)

Tak, w rzeczywistości posiadam znacznie bardziej skomplikowane filtrowania i takie rozbicie naprawdę według mnie poprawia czytelność kodu.
Tutaj był przykład tylko teoretyczny, aby zobrazować problem.

Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1