I am basically trying to create this query with NHibernate ICriteria interface:
SomeTable 1:n AnotherTable
SomeTable has columns: PrimaryKey, NonAggregateColumn
AnotherTable has columns: PrimaryKey, ForeignKey, AnotherNonAggregate, YetAnotherNonAggregate
SELECT
table1.NonAggregateColumn,
subquery.SubQueryAggregate1,
subquery.SubQueryAggregate2
FROM
SomeTable AS table1
LEFT JOIN
(
SELECT
table2.ForeignKey,
COUNT(table2.AnotherNonAggregate) AS SubQueryAggregate1,
AVG(table2.YetAnotherNonAggregate) AS SubQueryAggregate2
FROM AnotherTable AS table2
GROUP BY (table2.ForeignKey)
) AS subquery ON subquery.ForeignKey = table1.PrimaryKey
It is clear that using Projection subquery is not very efficient, since SQL has to scan the table twice (one projection subquery per aggregate).
Using multiple GROUP BYs is not efficient as well.
Is there a solution for this ? So far I've been resorting to using raw SQL but this is getting unwieldy for complex reports.
Unfortunately, Criteria is a bit restricted.
Try this:
You probably need to play around a bit, it's more of a guess. It also might be impossible this way.
It should produce something like this:
Generally:
DetachedCriteria
. See the docs for more details.in
,exists
etc.)AnotherTable
and navigate toSomeTable
. This might be a alternative solution.