Lesser-Known NHibernate Features: Mixing Client and Server-Side Calls in Projections
Another not widely known feature of NHibernate: mixing client and server-side calls.
To illustrate this, imagine that you want to calculate the difference between a mapped DateTime property and the current time, DateTime.Now. The following query works in NHibernate, but not in other O/RM frameworks:
1: var timespans = session.Query<Order>().Select(x => DateTime.Now - x.Date).ToList();
The generated SQL will only be:
1: select
2: order0_.[date] as col_0_0_
3: from
4: [
5: order] order0_
But NHibernate will detect that the result needs to be combined with something from the client side and will return a TimeSpan. This mechanism is extensible – more on this in a future post.
In other O/RMs, which shall remain unnamed, you have to use LINQ to Objects after LINQ to Unnamed Framework:
1: ctx.Orders.Select(x => new { ElapsedTime = SqlFunctions.DateDiff("HOUR", x.Date, DateTime.Now) }).ToList().Select(x => TimeSpan.FromHours(x.EllapsedTime));
Pretty cool, don’t you think?