sto fondamentalmente cercando di creare questa query con interfaccia NHibernate ICriteria:NHibernate 2.1: LEFT JOIN sul SubQuery con Alias (ICriteria)
SomeTable 1: n AnotherTable
SomeTable ha colonne: PrimaryKey, NonAggregateColumn
AnotherTable ha colonne: 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
È evidente che l'utilizzo della sottoquery Projection non è molto efficiente, dal momento che SQL deve eseguire la scansione della tabella due volte (una subquery di proiezione per aggregato).
L'utilizzo di più GROUP BY non è efficiente.
C'è una soluzione per questo? Finora mi sono ricorso all'utilizzo di SQL non elaborato, ma questo risulta ingombrante per report complessi.
Puoi chiarire la tua domanda? La query che stai visualizzando è sql nativo. Ritorna già i dati previsti? Vuoi trasformarlo in criteri. Perché non HQL? –
Hai dimenticato di menzionare: stai utilizzando un ORM. Quindi, per scrivere una query, non devi preoccuparti troppo dei tavoli e della chiave esterna. Molto più importanti sono le entità e le definizioni di mappatura. Quindi, come sono mappati questi ai tavoli? C'è una lista in SomeTable? C'è un riferimento in AnotherTable? O entrambi? –
Sì, la query originale restituisce i dati necessari per un report. Sto usando NHibernate 2.1. L'API dei criteri è preferibile a causa dell'abilità di tipizzazione forte tramite NHLambdaExtensions (che sto anche utilizzando). Sto usando i nomi SomeTable, AnotherTable per rendere l'SQL chiaro e facile da leggere. È uno specchio fittizio di oggetti reali. L'oggetto mappato SomeTable ha una raccolta inversa uno-a-molti di oggetti AnotherTable. –