nhibernate-core
nhibernate-core copied to clipboard
NH-3203 - Where method on "group by into" doesn't have any effect on SQL query
Alexey Zimarev created an issue — :
I use the Linq query
var q = from o in session.Query<OrdreLinjeVerdier>() where o.OrdreLinjeReserve > 0 group o by o.ProduktLager.ProduktLagerID into g select new { ProduktLagerID = g.Key, OrdreRes = g.Sum(x => x.OrdreLinjeReserve), OrdreResUtenSpesial = g.Where(x => x.LeveringsType.LeveringsTypeID == 1).Sum(x => (double?)x.OrdreLinjeReserve), OrdreResKunGodkjent = g.Where(x => x.LeveringsType.LeveringsTypeID == 1 && x.OrdreHoldStatus.OrdreHoldStatusID == 1).Sum(x => (double?)x.OrdreLinjeReserve) };Which translates to the SQL query
select ordrelinje0*.ProduktLagerID as col_0_0*, cast(sum(ordrelinje0*.OrdreLinjeReserve) as DECIMAL(19,5)) as col_1_0*, cast(sum(ordrelinje0*.OrdreLinjeReserve) as DOUBLE PRECISION) as col_2_0*, cast(sum(ordrelinje0*.OrdreLinjeReserve) as DOUBLE PRECISION) as col_3_0* from OrdreLinjeVerdier ordrelinje0_ where ordrelinje0_.OrdreLinjeReserve>@p0 group by ordrelinje0_.ProduktLagerID; @p0 = 0 <Type: Decimal (0)>As I can see Where method calls doesn't have any effect on the query when I expect it to produce CASE WHEN in the SQL query. When I use Projections.Conditional with Restrictions.Where it works fine.
Alexander Zaytsev added a comment — :
Could you please check if it works in master
Bohdan Makohin added a comment — :
Doesn't work as of NHibernate 4.0.0.4000
This recently bit our development team. It seems to be an issue with the .Sum() aggregate, because it works as expected with .Count(). You can work around it by using a ternary in the .Sum(). This is a little closer to the CASE statement that you'd write in SQL.
OrdreResUtenSpesial = (double?)g.Sum(x => x.LeveringsType.LeveringsTypeID == 1 ? x.OrdreLinjeReserve : 0d) ?? 0d,
Although there is a workaround, it would be great to see some movement on this, because it is against expectations. It will work and produce the incorrect result. You'd almost rather have a hard failure.