У меня есть запрос, который я написал с помощью функции критериев NHibernate, и я хочу его оптимизировать. Запрос объединяет 4 таблицы. Запрос работает, но сгенерированный SQL возвращает все столбцы для 4 таблиц, а не только информацию, которую я хочу вернуть. Я использую SetResultTransformer в запросе, который формирует возвращаемые данные для объекта Individual, но только после того, как больший sql возвращается с сервера.
Вот критерии NHibernate
return session.CreateCriteria(typeof(Individual))
.CreateAlias("ExternalIdentifiers", "ExternalIdentifier")
.CreateAlias("ExternalIdentifier.ExternalIdentifierType", "ExternalIdentifierType")
.CreateAlias("ExternalIdentifierType.DataSource", "Datasource")
.Add(Restrictions.Eq("ExternalIdentifier.Text1", ExternalId))
.Add(Restrictions.Eq("ExternalIdentifierType.Code", ExternalIdType))
.Add(Restrictions.Eq("Datasource.Code", DataSourceCode))
.SetResultTransformer(new NHibernate.Transform.RootEntityResultTransformer());
И сгенерированный sql (от NHProfiler) равен
SELECT (all columns from all joined tables)
FROM INDIVIDUAL this_
inner join EXTERNAL_ID externalid1_
on this_.INDIVIDUAL_GUID = externalid1_.GENERIC_GUID
inner join EXTERNAL_ID_TYPE externalid2_
on externalid1_.EXTERNAL_ID_TYPE_GUID = externalid2_.EXTERNAL_ID_TYPE_GUID
inner join SYSTEM_SRC datasource3_
on externalid2_.SYSTEM_SRC_GUID = datasource3_.SYSTEM_SRC_GUID
WHERE externalid1_.EXTERNAL_ID_TEXT_1 = 96800 /* @p0 */
and externalid2_.EXTERNAL_ID_TYPE_CODE = 'PATIENT' /* @p1 */
and datasource3_.SYSTEM_SRC_CODE = 'TOUCHPOINT' /* @p2 */
Я хочу вернуть столбцы только из индивидуальной таблицы. Я мог бы установить проекцию, но потом я потерял индивидуальный тип.
Я также мог бы переписать это с DetachedCriteria.
Это мои единственные варианты?