Tak to prawda. Ci co mnie znają, wiedzą o mojej negatywnej opinii o EF, a pozytywnej o NHibernate’ie.
Jednak ostatnio znalazłem bardzo przydatną funkcjonalność, tak naprawdę dowiedziałem się o jej braku w NHibernacie w porównaniu do EF. Otóż wyobraźmy sobie, że mamy zdefiniowaną poniższą metodę, która zwraca na IQueryable – interfejs, który pozwala na komponowanie zapytań linq i dopiero w momencie, gdy chcemy je wykonać, wszystko pakowane jest w jednego SQL i wysyłane do bazy.
public IQueryable<OrderDto> FindOrders() { var dto = from o in EntityManager.CurrentSession.Query<Order>() select new OrderDto (o.Id, o.TotalCost, o.SubmitDate, o.OrderStatus); return dto; }
Niestety poniższy kod nie działa w NHibernacie – funkcjonalność ta nie została nadal zaimplementowana…
Tylko niektóre operatory są supportowane w tym kontekście, np. Skip i Take.
var r = from dto in finder.FindOrders() where dto.OrderStatus == OrderStatus.Draft select dto; var result = r.ToArray();
Oczywiście w EF wszystko ładnie działa, zapytania się komponują i generują poprawne selecty.