piątek, 18 września 2015

Entity Framework jak działa metoda Include [c#]

Niebezpieczeństwa w używaniu metody Include podczas budowania zapytań



Kiedy zaczynamy zabawę z Entity Framework'iem w .NET'cie wszystko wydaje się na prawdę proste. Piszemy co chcemy wyciągnąć za pomocą składni LINQ robimy np. wykonujemy zapytanie i już mamy wyciągnięte dane. Lecz do końca nie jest tak różowo jak się nam wydaje. Entity Framework ma taką naturę, że jeśli przestaniemy mu patrzeć na ręce bardzo szybko może nas wprowadzić w poważne tarapaty. Bardzo dobrym pomysłem jest zainstalowanie sobie darmowego Express Profiler i podglądanie jakie zapytania zostają wysyłane do bazy. Czasem na prawdę można się przestraszyć jakie potwory musi przetrawić baza. Począwszy od kilku zagnieżdżeń aż po kilometrowe SELECTy. Trzeba uważać w szczególności na metodę Include, która jest super narzędziem, lecz należy dołączać STARANNIE wyselekcjonowane dane. Trzeba uważać na długie ścieżki. Zamiast pisać

...Include("Osoba").Include("Osoba.Kraj").Include("Osoba.Kraj.Zdjecie")

lepiej jest:

.Include("Osoba.Kraj.Zdjecie")

Wygenerowane zapytanie jest mniejsze a im mniejsze tym lepsze. Dlatego też jeśli to możliwe obcinać SELECTy przez określenie jakie kolumny nas interesują .Select(p => .....)

czwartek, 17 września 2015

Podstawy wyjatków w csharp [c#]

Krótko o podstawach wyjątków (exceptions) w c#

W samym .NETcie istnieje bardzo dużo zdefiniowancyh już wyjątków, które możemy użyć w naszej aplikacji. Dziś skupimy się wyłącznie na podstawowych informacjach. Każdy wyjątek dziedziczy po klasie Exception. Jest to klasa nadrzędna dla exceptionów. Schodząc niżej o jeden poziom następuje podział na: ApplicationException oraz SystemException.

SystemException - po tej klasie dziedziczą wszystkie systemowe (dotnetowe) wyjątki takie jak nasz "ulubiony" NullPointerException. Można w skrócie powiedzieć, iż są to wyjątki dla niskopoziomowych części systemu.

ApplicationException - dziedziczą po niej wyjątki rzucane w wysokopoziomowych częściach aplikacji. Jeśli piszemy jakąś aplikację to dobrze jest aby nasze customowe wyjątki właśnie po niej dziedziczyły. Np. przypuścmy wystąpiła w naszej aplikacji jakaś sytuacja wyjątkowa, wtedy rzucamy naszym własnym wyjątkiem np. CustomException, dziedziczącym po ApplicationException.

Cała moc exeptionów właśnie w hierarchii w ich łapaniu. Dawno temu kiedy jeszcze nie było wyjątków reagowanie na wyjątkowe sytuacje odbywało się przez zwracanie odpowiedniego kodu błędu. Można było się w tym pogubić.

Zobaczmy prosty przykład użycia:
class NameException : ApplicationException {}

//----
// jakieś linie kodu
// i dochodzi do sytuacji wyjątkowej
//----


try{

  if (string.IsNullOrEmpty(name)) {
   throw new NameException();
  }
}catch(NameException ex) {
 // tutaj przejdzie sterowanie
}
catch(ApplicationException ex){ 
 // tutaj nie przejdzie
}
catch(Exception ex) {
 // tutaj tez nie przejdzie
}

Jeślibyśmy rzucili zamiast NameException jakimś innym dziedziczącym po ApplicationException to by wpadło do drugiego catcha. Natomiast wyrzucony wyjątek dziedziczyłby zaraz po klasie Exception to by wpadł do 3 catcha.
Dlatego bardzo ważna jest hieriarchia aby odpowiednio móc przechwytywać i reagować na wyjątki.

czwartek, 28 maja 2015

Bootstrap dobra ksiązka

Bootstrap - Twoje szukanie dobrej książki dotyczącej bootstrapa chyba dobiegło końca

Pamiętam doskonale czasy kiedy jak się chciało stworzyć jakąś aplikację internetową, to nie mogło się obejść bez grafika i "cssmana". W pomyśle na "mega-super-biznes" zawsze istniała skromna pozycja: "grafika + cięcie szablonu". Lecz mimo wszystko rodzi, to problemy czasowo-finansowe. Kto? Jak? Co? Za ile? I dlaczego nie może być taniej i szybciej, przecież pomysł wypali na 100% a kasa i wieczna chwała czeka tuż za rogiem...? ;) Po paru latach na świat przyszedł bootstrap, który wywodzi się z podobnego problemu. W "twitterze" mieli już dość tworzenia osobnych szablonów dla wewnętrznych systemów. Ujednolicenie okazało się zbawieniem...?

Spoglądając na dzisiejsze "startupy" można powiedzieć jedno: bootstrap się przyjął i jest powszechnie stosowany. Ujednolicony html, z jsem tworzą na prawdę całkiem przyjemną strukturę do pracy nawet dla średniozorientowanego programisty, ktory z cssem i htmlem ma niewiele wspólnego. A jeśli doliczymy do tego możliwość zakupu "wypasionych bootstrapów" z themeforest.net, startbootstrap.com etc to już nasze życie programisty posiadającego pomysł na biznes staje się o ciut prostsze (i tańsze zarazem) ;) Podobny układ graficzny wychodzi jedynie na plus dla użytkownika, który wchodząc na taką stronę odnosi wrażenie, że gdzieś to już widział i zna dzięki temu interface. Oczywiście zależy to dużo od szablonu, lecz stosując się do pewnych standardów spokojnie możemy standaryzować internet.

Dla osób chcących poznać dokładnie bootstrapa... dobra książka


C# 6.0 i MVC 5. Tworzenie portali internetowych - opinie / recenzja

Czy warto kupić ksiązkę C# 6.0 i MVC 5. Tworzenie portali internetowych?

Po "nagabywaniu" na facebooku i na niektórych blogach doszedłem do wniosku, że trzeba sprawdzić tę książkę, czy rzeczywiście jest tak dobra jak o niej piszą. W sam raz trafiła się promocja na ebookpointcie z okazji dnia książki (?) jeśli dobrze pamiętam i bam! Za pół ceny można zobaczyć co tam polscy autorzy napisali... nie mam zbyt pozytywnych opinii o polskich autorach książek technicznych niestety (za wyjątkiem Jarosława Zabiełło).

Spis treści prezentuje się imponująco. Mamy przekrój przez język c# od wersji 2.0 po (zapowiedź) 6.0. Wg mnie to bardzo miłe zamieszczać coś w książce o csharp 6.0 jak nawet jeszcze się nie ukazało. Można owszem poczytać na necie co tam się znajdzie, lecz o wiele lepiej raz a dobrze zażyć taką skondensowaną kapsułę. Bardzo dobre wrażenie na mnie zrobiło zamieszczenie wzorców architektonicznych. Mimo, że w asp.net mvc taplamy się wyłącznie w MVC, to można uzupełnić wiedzę o MVP, MVVP (nawiasem mówiąc asp.net mvc, to nie jest tak na prawdę prawdziwy MVC, lecz wzorzec model-2, ale to inna bajka). Cieszy też fakt, że postały pokrótce objaśnione terminy DDD, SOA, EDA. Nie spodziewałem się, że w książce dotyczącej ASP.NET można jeszcze znaleźć opis jak działa i jak jest podzielona cała platforma .NET. Są to takie smaczki tej książki, żadne wodolejstwo.

Książka "C# 6.0 i MVC 5. Tworzenie portali internetowych" wprowadza czytelnika w świat Entity Framework oraz całego stosu webowego. Wystarczająco są opisane każde aspekty, z którymi przyjdzie pracować podczas tworzenia aplikacji internetowej. Nie ma sensu tak na prawdę ich przytaczać bowiem znajdziemy wszystko co jest najważniejsze / najciekawsze np. metody asynchroniczne, cache, bezpieczeństwo, modeview, routing, IoC, ba! nawet znajdziecie zasady SOLID, słów kilka o bazach nieralacyjnych MongoDB, RavenDB.

Czy warto kupić tę książkę? Odpowiedź może być zaskakująca, ale jeśli ktoś pracuje z ASP.NET MVC, parę lat np. od wersji 2.0 czy 3.0 to myślę, że "samoistnie" się nauczył niemal wszystkiego. Natomiast dodatki uzupełni przeglądając wyrywkowo blogi lub jakieś tutoriale. Oczywiście książka usystematyzuje / uporządkuje wiedzie, lecz aż tak tego nie czuć. Natomiast jeśli jakaś osoba czuje, że ma braki np. Entity Framework jest dla niej czarną (lub szarą) magia, chętnie chciałby się dowiedzieć czegoś więcej o MVC jak to działa, jak używać etc to ZDECYDOWANIE MUSI MIEĆ TĘ KSIĄŻKĘ. Czyli, jeśli zjadłeś zęby na ".necie", może warto kupić, lecz jeśli ten świat jest dla Ciebie nowy lub czujesz, że czegoś Ci brak, to śmiało, kupuj bez namysłu.

niedziela, 8 marca 2015

[c#] Entity Framework - Wypisanie wygenerowanych zapytań na ekran

Nie raz podczas pracy z Entity Framework chcemy podejrzeć jak wyglądają wygenerowane zapytania SQL. Może coś nie działa jak tego byśmy chcieli, lub szukamy sposobu optymalizacji zapytania. Na szczęście Entity Framework został bardzo dobrze przemyślany i takie podglądnięcie wygenerowanego/surowego sqla nie stanowi żadnego problemu:

using(var content = new DatabaseContext())

{
  context.Database.Log = Console.Write;
  var user = context.Users.First(); // na ekran trafi wygenerowany select wyciągający pierwszego usera z tablicy
}
 
prawda, że proste? A co jeśli chcielibyśmy zapisywać sobie te zapytania do pliku, aby np. móc przewkleić je do jakiegoś managera SQL w celu analizy? Chłopaki od Entity Frameworka, też o tym pomyśleli:

1) Najpierw trzeba utworzyć swojego Loggera (nic trudnego)

public class Logger
{
  public void Log(string message)
  {
    // w tym miejscu można użyć dowolnej biblioteki do logowania np. log4net, nlog etc
    File.AppendAllText("log.txt", message + Environment.NewLine); 
  }
}

2) Następnie podczepiamy loggera do contextu:

var logger = new Logger();
context.Database.Log = sql => logger.Log(sql);

Gotowe, możemy teraz się cieszyć zapisanym sqlem w logu.

[c#] Stopwatch - jak zmierzyć czas wykonywania kodu

Przestawiam klasę stopwatch do mierzenia czasu wykonywania kodu w c#

Czasy kiedy do mierzenia czasu wykonywania kodu używaliśmy:

DateTime now = DateTime.Now;
// KOD
Console.WriteList(DateTime.Now - now);
bezpowrotnie już minęły. W .NET 4.5 otrzymaliśmy bardzo prostą, gotową do użycia klasę Stopwatch. Dostarcza ona większej precyzji niż zbada z DateTime.Now

Najprostsze użycie tego toola wygląda tak:

Stopwatch sw = Stopwatch.StartNew(); // od razu zegar zostaje wystartowany
// KOD
sw.Stop(); // zatrzymujemy zegar
Console.WriteList("Czas wykonywania: {0}ms", sw.ElapsedMilliseconds);

czego chcieć więcej od tak małej i użytecznej klasy? Oczywiście możemy utworzyć instancje Stopwatch i wykorzystać go kilka razy używając metod Reset() - do zresetowania czasu, Restart() - do resetu oraz natychmiastowego puszczenia ponownie zegara.

Stopwatch sw = new Stopwatch();
sw.Start(); // start zegara
// KOD
sw.Stop(); // zatrzymujemy
Console.WriteLine(sw.ElapsedMilliseconds);

sw.Reset(); // zerujemy zegar
sw.Start(); // start zegara
// KOD
sw.Stop(); // zatrzymujemy
Console.WriteLine(sw.ElapsedMilliseconds);

sw.Restart(); // zerujemy zegar i od razu go puszczamy w ruch
// KOD
sw.Stop(); // zatrzymujemy
Console.WriteLine(sw.ElapsedMilliseconds);

Ta klasa się można domyśleć bardzo dobrze przydaje w badaniu wydajności kodu i wszelakich optymalizacjach.

[c#] Zrozumieć LINQ część 1: Podstawy "czystego" LINQ

Dziś przedstawie podstawy LINQ w .NETcie. Nie ma potrzeby pisać dokładnie co to jest, jak działa, bo na dowolnej stronie poświęconej LINQ można to wyczytać. Bardzo istotną rzeczą jest zrozumienie o co w tym wszystkim chodzi.

Cała zabawa z LINQ polega na wywoływaniu metod/funkcji, aż do osiągnięcia interesuącego nas rezultatu (oczywiście nie jest to całkowita prawda, lecz w tym pierwszym poście wszystko upraszczamy). Schemat działania wygląda mniej więcej tak:

Dane wpadają do metody, która coś z nim robi, następnie wynik przekazuje innej metodzie itd. aż do zakończenia. Można to sobie wyobrazić, iż to działa na zasadzie sekwencji: A -> B -> C -> Wynik

Zobaczmy prosty przykład. Chcemy wygenerować 1000 elementową kolekcję. Bez użycia LINQ zrobilibyśmy zwykłą pętle for z granicą < 1000. To za dużo pisania, wystarczy to zrobić w tak:
Enumerable.Range(0, 1000)

Tak na marginesie w języku ruby (który też zawiera elementy programowania funkcyjnego) bardzo mi się podoba zapis:
5.times {|i| p i}

Znaczy, że to jest w klamrach (bloku) wykona się 5 razy. W csharpie ten sam efekt możemy właśnie osiągnąć przez:
Enumerable.Range(0, 10000000).ToList().ForEach(Console.WriteLine)

Jak widać ruby w tym przypadku (i nie tylko) jest bardzo zwięzły, ale nie o tym języku miało być dzisiaj.. ale wracając do LINQ. Microsoft dał .NETowcom, bardzo potężne i szybkie narzędzie to operacji na wszelakiego rodzaju kolekcjach.

1) Aby wyciągnąć maksymalny element w tablicy wystarczy użyć:
listaIntow.Max(); // jeśli lista zawiera same inty
listaUserow.Max(user => user.Id); // tablica zawiera użytkowników, Max zwróci usera z największym ID

2) Suma:
listaIntow.Sum();
listaUserow.Max(user => user.Id); // suma id

3) Ilość
listaIntow.Count();
listaUserow.Count();

4) Średnia
listaIntow.Average();
listaUserow.Average(user => user.Id); // średnia ze wszystkich wartości user ID

5) Minimum
identycznie jak Max

6) Sortowanie
listaIntow.OrderBy(); // OrderByDescending
listaUserow.OrderBy(user => user.Id); // OrderByDescending(user => user.Id);

LINQ daje nam na prawdę ogromne możliwości, nie wspominając już o PLINQ (paraller linq), ale to temat na osobny post.

Wyobraźmy sobie, że chcemy wygenerować liczby parzyste pomnożone przez 2, a następnie wynik chcemy wypisać w konsoli. Bez LINQ musielibyśmy się trochę upisać aby coś takiego osiągnąć.

Enumerable.Rang(0, 1000).Where(x=> x % 2 == 0).Select(x => x * 2).ToList().ForEach(Console.Write);

Mam nadzieję, że zachęciłem osoby, które jeszcze nie znają świata LINQ do zapoznania się z nim bliżej, w następnym poście spróbuję pokazać praktyczne przykłady użycia.