Jak pobierać dane z bazy danych, szybko ale i wygodnie

Odpowiedz Nowy wątek
2018-11-22 09:24
0

Cześć,
Mam pytanie jak polecacie pobierać dane z bazy danych by było to w miarę optymalne ale tez łatwe w utrzymaniu ?
Zacząłem używac automapperra i Queryable Extensions ale niestety jak podejrzałem w sqlprofile jak bardzo nadmiarowe zapytania idą do bazy to trochę zwątpiłem.
Najszybszy sposób to pewnie ten za pomocą klas SQLCommand i SqlDataReader ale niestety ten sposób jest dosyć mozolny, ciężki w utrzymaniu i w momencie gdy trzeba coś zmodyfikować to można się załamać. Jak wy to robicie w swoich projektach ? Jak podchodzicie do tematu ? (chodzi mi o projekty duże, z wieloma ViemModelami itd )
Pozdrawiam

Pozostało 580 znaków

2018-11-22 09:51
0

Automapper na pewno nie jest łatwy w utrzymaniu bo ukrywa sporo rzeczy. Co to znaczy że zapytania są nadmiarowe ? Jeśli klienci nie odczuwają jakiś mocnych opóźnień to nie ma sensu nic optymalizować. W większości aplikacji EF będzie wystarczająco wydajny. Jeśli jednak napotkasz jakieś problemy to przede wszystkim szukałbym optymalizacji po stronie bazy danych (indeksy, wypłaszczenie struktur, tabele in memory) potem jakiś cache po stronie aplikacji i ORM'a. Jeśli jednak chcesz koniecznie pisać sam zapytania to robiłbym to w bazie danych bo tam jest ich miejsce. Czyli procedury składowane itp i wywoływanie ich po stronie kodu. Procedury w bazie będą lepiej utrzymywalne niż zapytania w stringach w kodzie. Możesz je też łatwo wersjonować co ułatwia utrzymanie aplikacji.

edytowany 2x, ostatnio: error91, 2018-11-22 09:51
Różnica w zapytaniach to nieraz rząd różnicy np. zapytanie napisane w SQL i wywołane w SQLCommand wykonuje sie 30 ms a to z Automapper + EF 450. więc różnica jest bardzo duza - ice25 2018-11-22 10:24
Może napisałeś źle LINQ ? Bo coś tu śmierdzi. Poza tym mógłbyś wkleić kod jak to mierzysz itp. - error91 2018-11-22 10:29
Na temat wątku dyskutujmy w postach, a nie komentarzach. - somekind 2018-11-22 11:56

Pozostało 580 znaków

2018-11-22 10:45
3

Jeśli sobie EF nie radzi z wygenerowanie jakiegoś zapytania, to można wtedy użyć czystego SQL + EF:
Raw SQL Queries

Ewentualnie do samych odczytów można używać Dapper, ale do zapisów też wypadałoby mieć pełnego ORM, bo używanie Dappera jest zbyt toporne.

Także obecnie używam jedną z dwóch kombinacji

  • do zapisów EF + do odczytów Raw SQL Queries jak sobie EF nie radzi
  • do zapisów EF + do wszystkich odczytów Dapper

#Dżunior React Devloper wanna be#
edytowany 2x, ostatnio: neves, 2018-11-22 12:13
Dapper ma też rozszerzenie CRUDowe, które eliminuje trochę jego toporność: https://github.com/ericdc1/Dapper.SimpleCRUD - mstl 2018-11-22 13:06

Pozostało 580 znaków

2018-11-22 11:56

To może lepiej https://github.com/StackExchange/Dapper?


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."
Dobry pomysł. Od razu daj mu też linka do nHibernate i EFC, bo jakby napotkał ścianę podczas używania Dappera, to od razu mógłby zmienić na kolejnego ORMa i tak w kółko :) Nie. Zazwyczaj problemy się rozwiązuje, a nie zmienia stack. No chyba, że stack jest problemem, ale jest to wątpliwe w tym przypadku. - WeiXiao 2018-11-22 18:24
Skoro problemem są nieoptymalne zapytania generowane przez g**no, to rozwiązaniem jest pozbycie się gówna. - somekind 2018-11-22 21:10
@somekind: Albo napisanie lepiej linq / drzewek / czystego sqla - WeiXiao 2018-11-22 21:13
EF nie pomaga "pisanie lepiej", on i tak wygeneruje tragiczny SQL. Nie masz wpływu nawet na to, jaki join zostanie użyty. A jeśli mamy pisać SQL, to po co używać EF? - somekind 2018-11-23 01:52
@somekind: Bo napiszemy ten SQL w nie wiem... kilku miejscach, a w całej reszcie wykorzystamy prostotę EF? chyba nawet na SO tak zrobili przy ostatnich przenoszeniach na EFC. - WeiXiao 2018-11-23 17:49

Pozostało 580 znaków

2019-01-15 14:14
0

czy da się w jakiś inny sposob zapisać wyrażenie które podałem tak aby udało się je wykonac wykorzystujac projectTo ?

CreateMap<Car,CarFullInformationViewModel>()
.ForMember(d=>d.EngineName, o=>o.mapFrom(s=> Mapper.Map<IEngineName>(s.Engine).EngineName
; 

Create<Engine,IEngineName>()
.ForMember(d=>d.EngineName, o=>o.mapFrom(s=>s.Name != null ? s.Name : "Brak danych" )
;

Bo niestety obecnie Krzyczy że " Linq to Entities does not recognize the Method ......"

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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