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