я в основном пытаются создать этот запрос с интерфейсом NHibernate ICriteria:NHibernate 2.1: LEFT JOIN на подзапрос с Алиас (ICriteria)
SomeTable 1: п AnotherTable
SomeTable имеет столбцы: PrimaryKey, NonAggregateColumn
AnotherTable имеет столбцы: 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
Понятно, что использование подзапроса Projection не очень эффективно, поскольку SQL приходится дважды сканировать таблицу (один подзапрос проекции на совокупность).
Использование нескольких команд GROUP BY также неэффективно.
Есть ли решение для этого? До сих пор я прибегал к использованию raw SQL, но это становится громоздким для сложных отчетов.
Уточнить вопрос? Запрос, который вы показываете, является родным sql. Он уже возвращает ожидаемые данные? Вы хотите превратить его в критерии. Почему бы не HQL? –
Забыл упомянуть: вы используете ORM. Поэтому, чтобы написать запрос, вам не нужно слишком много заботиться о таблицах и внешнем ключе. Гораздо важнее сущности и определения отображения. Итак, как они отображаются на таблицах? Есть ли список в SomeTable? Есть ли ссылка в AnotherTable? Или оба? –
Да, исходный запрос возвращает необходимые данные для отчета. Я использую NHibernate 2.1. Критерии API предпочтительнее из-за сильной типизирующей способности через NHLambdaExtensions (который я также использую). Я использую имена SomeTable, AnotherTable, чтобы сделать SQL ясным и легко читаемым. Это фиктивное зеркало реальных объектов. SomeTable сопоставленный объект имеет обратную коллекцию one-to-many объектов AnotherTable. –