Ale zacznijmy od początku. Wykonując zapytanie do bazy danych z poziomu NHibernate 2 mieliśmy do dyspozycji 4 możliwości:
- wywołanie metod Get/Load
- zapytanie HQL
- użycie Criteria API
- zapytania SQL
OrderDto order = _session.CreateCriteria<Domain.Order>("o") .Add(Restrictions.IdEq(id)) .SetProjection(Projections.ProjectionList() .Add(Projections.Property("o.Id"), "Id") .Add(Projections.Property("o.ClientName"), "ClientName") .Add(Projections.Property("o.Address"), "Address")) .SetResultTransformer(Transformers.AliasToBean<OrderDto>()) .UniqueResult<OrderDto>();Z tymi napisami da się żyć, jasne. Powiem nawet, że da się do tego przyzwyczaić. Ale używając QueryOver ta kwestia odchodzi do lamusa. Dzięki temu API otrzymujemy zamiast napisów statyczne typowanie, a tym samym zyskujemy Intellisense i informacje o błędach na poziomie kompilacji. Powyższy kod zostaje zatem zamieniony na:
OrderDto dto = null; OrderDto order = _session.QueryOver<Domain.Order>() .Where(o => o.Id == id) .SelectList(list => list .Select(o => o.Id).WithAlias(() => dto.Id) .Select(o => o.ClientName).WithAlias(() => dto.ClientName) .Select(o => o.Address).WithAlias(() => dto.Address)) .TransformUsing(Transformers.AliasToBean<OrderDto>()) .SingleOrDefault<OrderDto>();Co interesujące warto zwrócić uwagę na fakt, że QueryOver jest jedynie nakładką na Criteria API. Widać to choćby po sposobie deklarowania aliasów. Używany jest w nich pusty obiekt! Na początku byłem zaskoczony. Ale w sumie jedyne co na tym poziomie jest potrzebne to nazwa używanej właściwości, a reszta już tkwi w System.Linq.Expressions i wcześniej wykorzystywanej metodzie stanowiącej "magię" NHibernata ;]
Brak komentarzy:
Prześlij komentarz