Dzięki ORM teoretycznie nie musimy przejmować się tym, jak budować zapytania SQL. Niestety z niektórymi konstrukcjami te biblioteki radzą sobie słabo. Przedstawię przykłady zapytań w EF, które doprowadziły do nieoczekiwanego kodu SQL, oraz jak można je zapisać lepiej. Pokażę też kilka pułapek – specyfiki języka SQL, który zachowuje się inaczej niż intuicja (programisty .NET) podpowiada.
2. 2WWW.HIGHWEELSOFTWARE.COM
Kto mówi?
• Przemysław Dzierżak
• Programista .NET od 2005 roku
• Architekt hurtowni danych (Microsoft SQL Server)
• Współwłaściciel
• Miłośnik:
• Automatyzacji
• Czytelnego kodu
• LEAN Software Development / Agile
7. WWW.HIGHWEELSOFTWARE.COM
Ile powinien żyć DbContext?
Pełna odpowiedź – Unit of Work – transakcja biznesowa
• Parametr każdej metody dostępu do danych
• AddUser (context, userData), DisableUser(context, userId) , …
• … lub magia
• -> http://mehdi.me/ambient-dbcontext-in-ef6/
Prosta odpowiedź:
• Web – 1 request
• Desktop – 1 okno (form)
• https://msdn.microsoft.com/en-us/library/jj729737(v=vs.113).aspx
Koniecznie Dispose()
7
12. WWW.HIGHWEELSOFTWARE.COM
Praca z bazą danych – ogólne zasady
• Niewielka liczba zapytań, najlepiej O(1)
• W bazie danych:
• Filtrowanie
• Ograniczenie liczby kolumn
• Grupowanie
• Sortowanie
• Stronicowanie
DEMO
12
13. WWW.HIGHWEELSOFTWARE.COM
Efektywne zapytania - narzędzia
• SQL Profiler i narzędzia VS
• Opóźnione wykonanie ( IQueryable<T> vs ToList, AsEnumerable)
• Include()
• Szczegół -> ogół / SelectMany
• Unikanie CAST
Tylko odczyt?
• Ograniczanie kolumn
• AsNoTracking()
• Brak cache’a
13
14. WWW.HIGHWEELSOFTWARE.COM
Entity Framework – zapis dużych wolumenów danych
DEMO
• Wyłączenie śledzenia zmian
context.Configuration.AutoDetectChangesEnabled = false;
• Dzielenie na paczki po 1-10k wierszy
• W ostateczności Bulk Insert
Dużo zmian? („UPSERT”)
• Wczytaj zbiór, modyfikuj/dodawaj
• Lub tabela ‚tymczasowa’ + MERGE
14
15. WWW.HIGHWEELSOFTWARE.COM
Na zakończenie
• Nie dajmy się zwariować
• mało danych – prostsze wygrywa
• EF (i inne ORM) mają być wygodne, nie szybkie
• Znajomość wykorzystywanej technologii
15