Asynchroniczne zawołanie do bazy danych przez ORM (EF Core), czy ma sens?

0

Hej, zacząłem się zastanawiać, czy pytając się o, dla przykładu, listę łańcuchów z bazy danych, dodatkowo filtrowanych przez LINQ, ma sens?

Dla przykładu, mam metodę kontrolera MVC, która pyta się repo (DAL) o listę:

List<string> vesselTypes = await _repositoryVessels.GetVesselTypes();

według tej, dość wysoko z resztą punktowanej odpowiedzi, powinienem przetworzyć zapytanie następująco:

private IQueryable<VesselModel> GetVesselQueryable()
        {
            return _context.Vessels.AsQueryable();
        }

        public async Task<List<string>> GetVesselTypes()
        {
            return await GetVesselTypesQueryable().Select(v => v.VesselType).Distinct().ToListAsync();
        }

Czy to jest dobra praktyka, czy przerost formy nad treścią i wyciąganie zbyt dużego obiektu do GetVesselQueryable?

0

Nie rozumiem dokładnie o co ci chodzi. Natomiast robienie metody GetVesselQueryable to chyba w ogóle przerost formy nad treścią w porównaniu do pisania po prostu _context.Vessels, przecież to ma nawet porównywalną długość :)

0
mad_penguin napisał(a):

Nie rozumiem dokładnie o co ci chodzi. Natomiast robienie metody GetVesselQueryable to chyba w ogóle przerost formy nad treścią w porównaniu do pisania po prostu _context.Vessels, przecież to ma nawet porównywalną długość :)

Wg. odpowiedzi na SO idea jest taka, że nie zblokować serwera SQL wieloma zapytaniami z await, stąd najpierw:

private IQueryable<VesselModel> GetVesselQueryable()
        {
            return _context.Vessels.AsQueryable();
        }
0

Wydaje mi się że Linq nie ma większego wpływu na prędkość kodu. Czy zrobiłbyś to z Linq, czy bez - jeden pies.

Jedyne pytanie jakie zostaje, to jak często wykonujesz te zapytania i jaka jest ilość przetwarzanych danych. Rzuć się na krótki speedtest i będziesz wiedział, czy jest w ogóle sens robić to asynchronicznie.

1

IQueryable nie ma nic wspólnego z asynchronicznością.

return await GetVesselTypesQueryable().Select(v => v.VesselType).Distinct().ToListAsync();

oraz

return await _context.Vessels.Select(v => v.VesselType).Distinct().ToListAsync();

działają identycznie.

Bardziej chodzi o to, żeby wołać ToListAsync na samym końcu, po podaniu wszystkich wherów i selectów, żeby filtrowanie i przetwarzanie danych było po stronie bazy i zostały zwrócone już przetworzone dane. Natomiast czy robisz to asynchronicznie czy nie to już nic nie zmienia :)

1

Ta metoda GetAllUrls zwracająca IQueryable jest chyba dlatego, że autor wątku na SO nie rozumie, co ona robi, a odpowiadający chce rozjaśnić wątpliwości, pokazując, jak zwracanie IQueryable ma się do asynchroniczności (czyli niewiele, ale można użyć, bo czemu nie).

Tak btw, to z repozytorium można w ogóle zwracać listę stringów? To chyba podchodzi pod DAO. #DDD

To mam metodę kontrolera MVC, która pyta się repo też nie brzmi dobrze. :P

Wg. odpowiedzi na SO idea jest taka, że nie zblokować serwera SQL wieloma zapytaniami z await

Żeby nie blokować serwera zapytaniami z await używa się await Task.WhenAll(task1, task2), jest to napisane w tej odpowiedzi :)

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